Hei Leute Ich habe ein Problem mit Bitmasken, dass ich irgendwie nicht auf die Reihe kriege. Gibt es eine Möglichkeit, unabhängig von einer Sprache, festzustellen an welcher Position eines Bitstrings eine Maske ansetzt? Hier ein Beispiel dass das Verständniss decken sollte: 01001011 Wert AND 00001000 Bitmaske ------------- = 00001000 Ergebnis ^ Hier setzt die Maske an. Wie kann ich diese Position ausmachen? Vielen Dank schon im voraus für eure Hilfe. Gruss Thomas
1 | input (x) |
2 | if x == 0 |
3 | print "keine Maske vorhanden" |
4 | else
|
5 | y := x XOR (x AND (x-1)) |
6 | z := log2 (x) |
7 | print "Bitposition = " + z |
Hey, du möchtest also die Position des Bits bestimmen? z.B. 0b0000.0001 wäre die Position 1, 0b0000.0010 die Position 2. Wenn du die Zahlen als Dezimalzahl darstellst, ergiben sich Werte von 1,2,4,8,16,32,64 oder 128 (bei 8 Bit). Das entspricht
wobei N die Position des Bits ist. Um nun das N zu ermitteln wendest du "einfach" den Logarithmus an
wobei X die Dezimalzahl darstellt. Das ist natürlich jetzt eine eher mathematische Lösung. Viele Grüße, Thomas
Thomas K. schrieb: > Um nun das N zu ermitteln wendest du "einfach" den Logarithmus anwobei X die Dezimalzahl darstellt. Das ist natürlich jetzt eine eher > mathematische Lösung. Ja, aber genau die richtige. Nachdem vorher sichergestellt ist, dass der Wert, auf den Du den Logarithmus anwendest, genau dieses eine unterste Bit gesetzt hat. Das macht Johanns Beispiel, wenn auch: > y := x XOR (x AND (x-1)) > z := log2 (x) ^^ nicht y? Prägnanter geht's wohl nicht.
Hei Nochmal :) Die Idee mit dem Logarithmus hatte ich ebenfalls. Nur muss ich feststellen dass es nicht möglich ist wenn die Bitmaske mehrere Werte definiert also beispielsweise sowas: 01001011 Wert AND 01001000 Bitmaske ------------- = 01001000 Ergebnis ^ ^ Hier setzt die Maske an. Möglicherweise liegt der Fehler auch an mir aber funktioniert der Trick mit der Logarithmie nicht mehr oder? Grüsse Thomas
Was spricht den dagegen das einfach "rauszuschieben" und bei jeder 1 eine Ausgabe zu machen (oder was auch immer du mit dem Ergebnis vor hast).
Richtig erkannt. Dafür sorgt die Zeile mit dem and und xor. 01001011 Wert AND 01001000 Bitmaske ------------- = 01001000 Ergebnis ^ ^ Hier setzt die Maske an. 01001000 Dein Ergebnis AND 01000111 Dein Ergebnis - 1 ------------- = 01000000 niedrigstes Bit wurde gelöscht. Bitmanipulation XOR 01001000 Dein ursprüngliches Ergebis ------------- = 00001000 Nur noch das niedrigste Bit des ursprünglichen Ergebnisses DAS ist immer eine glatte Zweierpotenz.
Mist es liegt wirklich an mir ;-) Sorry ich hab diese Codezeile glatt übersehen. Vielen Dank an Alle für die freundliche Mithilfe! :) Grüsse
Johann L. schrieb: > y := x XOR (x AND (x-1)) Nur des Senfs wegen: Das lässt sich vereinfachen zu
1 | y := x AND NOT (x-1) |
Wird im Zweierkomplement gerechnet, wird daraus
1 | y := x AND -x |
ich wäre auch für die Läubi "methode" (LOG ist ja wohl etwas übertrieben)
Malte S. schrieb: > Thomas K. schrieb: >> Um nun das N zu ermitteln wendest du "einfach" den Logarithmus an >> wobei X die Dezimalzahl darstellt. Das ist natürlich jetzt eine >> eher mathematische Lösung. > > Ja, aber genau die richtige. Nachdem vorher sichergestellt ist, dass der > Wert, auf den Du den Logarithmus anwendest, genau dieses eine unterste > Bit gesetzt hat. Das macht Johanns Beispiel, wenn auch: >> y := x XOR (x AND (x-1)) >> z := log2 (x) > ^^ nicht y? > > Prägnanter geht's wohl nicht. Ja, muß y heißen. Robert L. schrieb: > LOG ist ja wohl etwas übertrieben Was ist an einer mathematischen Funktion "übertrieben"? Einfacher als log geht's ja wohl kaum :-) Die Frage war ja explizit nicht bezüglich einer Programmiersprache.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.