Der Martin: Eine Frage zum Bitmuster

Beitrag lesen

Hallo,

unsigned int mask = 01 << 31;
Recherche: "01 << 31" soll die Bits um n Stellen nach links schieben und rechts Nullen auffüllen.

in diesem Beispiel: Der Wert 1 = 0x00000001, in dem nur das Bit 0 gesetzt ist, wird um 31 Bitpositionen nach links verschoben, so dass am Ende das Bit 31 gesetzt ist und sonst keins. Das ist mathematisch äquivalent zu 2³¹, da das Linksschieben um eine Bitposition der Multiplikation mit 2 entspricht (solange kein Überlauf auftritt).

while (i>=0) {
if ((z&mask) !=0)
Recherche: "(z&mask)" soll UND-Operation simultan auf jedes Bit anwenden und ein neues Bitmuster als Wert liefern.

Genau. Also alle Bits, die in z UND in mask gesetzt sind, bleiben auch im Ergebnis gesetzt; alle anderen werden zu 0. Übrigens ist der Ausdruck im if-Statement unnötig kompliziert; if () wertet einen Ausdruck ohnehin auf "ungleich Null" aus, so dass der Vergleich keinen besondern Sinn mehr ergibt. Er schadet nicht, aber ein einfaches if (z&mask) tut dasselbe und ist meiner Ansicht nach leichter zu lesen und zu begreifen.

mask >>= 1;}
Recherche: "mask >>= 1" soll eine Zuweisung nach Rechtsverschiebung sein.

Ja. Schiebe das Bitmuster in mask um eine Position nach rechts und schreibe es nach mask zurück.

Ich kann leider trotzdem nicht nachvollziehen, was das alles bedeutet und wie das Ganze funktioniert.
Könnte mir das jemand erklären?

Der Code ist unvollständig. Beispielsweise vermisse ich eine Operation auf i in der while-Schleife, denn der Wert von i muss irgendwo verändert werden, damit die Schleifenbedingung irgendwann mal nicht mehr erfüllt ist. Aber man kann ahnen, dass ein Zahlenwert z von "oben" her, also vom höchstwertigen Bit beginnend, Schritt für Schritt untersucht werden und vermutlich das höchste gesetzte Bit gefunden werden soll.

So long,
 Martin

--
Frauen sind wie Elektrizität: Fasst man sie an, kriegt man eine gewischt.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(