EMZETT.
Login

Bitmasken und Bit-Operationen

Kurz: Mit Operatoren wie AND, OR, XOR und Schiebeoperationen lassen sich einzelne Bits einer Zahl lesen, setzen und löschen, um viele Ja/Nein-Werte in einer Zahl zu speichern.

Genauer: Eine ganze Zahl besteht im Rechner aus Bits (0 oder 1). Bit-Operationen arbeiten Bit für Bit und sind sehr schnell. Eine Bitmaske ist eine Zahl, die bestimmte Bits auswählt. Typische Einsatzgebiete sind Dateiberechtigungen, Optionen („Flags“), Netzwerkmasken und Hardware-Register.

Im Detail

Die Operatoren

OperatorNameWirkung
&UNDBit ist 1, wenn beide 1 sind
|ODERBit ist 1, wenn mindestens eines 1 ist
^XORBit ist 1, wenn sie sich unterscheiden
~NICHTalle Bits umkehren
<<Linksschubnach links schieben (mal 2 je Schritt)
>>Rechtsschubnach rechts schieben (geteilt durch 2)

Flags setzen, prüfen, löschen

const LESEN = 1;      // 0001
const SCHREIBEN = 2;  // 0010
const AUSFUEHREN = 4; // 0100
 
let recht = LESEN | SCHREIBEN;     // setzen   -> 0011
const darfSchreiben = (recht & SCHREIBEN) !== 0; // prüfen
recht = recht & ~SCHREIBEN;        // löschen  -> 0001
recht = recht ^ AUSFUEHREN;        // umschalten -> 0101

Unter Linux sind Dateirechte genauso aufgebaut: rwx entspricht 4+2+1, daher chmod 755.

Nützliche Tricks

  • Gerade oder ungerade: n & 1.
  • Potenz von 2 prüfen: n > 0 && (n & (n - 1)) === 0.
  • Mit 2 multiplizieren: n << 1, durch 2 teilen: n >> 1.
  • Zwei Variablen tauschen mit XOR (eher als Kuriosität).
  • Subnetzmasken: Die Adresse AND Maske ergibt die Netzadresse.

Fallstricke

In vielen Sprachen sind Zahlen für Bit-Operationen auf 32 Bit begrenzt (in JavaScript werden sie in vorzeichenbehaftete 32-Bit-Ganzzahlen umgewandelt). Bei negativen Zahlen unterscheiden sich arithmetischer und logischer Rechtsschub (>> und >>>). Verwechsle & nicht mit dem logischen &&. Klare Namen für Flags und ein Kommentar sparen Verwirrung.

Siehe auch: Binär, dezimal, hexadezimal rechnen, Logische Operatoren, Operatoren