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
| Operator | Name | Wirkung |
|---|---|---|
& | UND | Bit ist 1, wenn beide 1 sind |
| | ODER | Bit ist 1, wenn mindestens eines 1 ist |
^ | XOR | Bit ist 1, wenn sie sich unterscheiden |
~ | NICHT | alle Bits umkehren |
<< | Linksschub | nach links schieben (mal 2 je Schritt) |
>> | Rechtsschub | nach 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 -> 0101Unter 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
ANDMaske 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