Wozu bitweise Operationen dienen

Bitweise Operationen arbeiten auf jeder Binärstelle einzeln. AND lässt nur die Bits auf 1, die in beiden Zahlen 1 sind, OR die, die in mindestens einer 1 sind, XOR die, die sich unterscheiden, NOT kehrt alle um. Sie sind die einfachsten Befehle eines Prozessors und die schnellsten.

Man liest und setzt damit einzelne Flags in einer Ganzzahl, wendet Masken wie Netzmasken an, verwaltet Unix-Dateirechte, in eine Ganzzahl gepackte Farben, Prüfsummen und Kryptografie. Ein AND mit 0x0F behält die unteren vier Bits, ein OR mit 0x80 setzt das oberste.

Eine Linksverschiebung um n Stellen multipliziert mit 2^n, eine Rechtsverschiebung teilt. Bei negativen Zahlen zählt der Unterschied zwischen logischer Verschiebung, die Nullen nachschiebt, und arithmetischer, die das Vorzeichenbit kopiert: -16 >> 2 ergibt -4, die logische Verschiebung eine große positive Zahl.

Häufige Fehler

  • Die Wortbreite vergessen: NOT 0 ergibt bei 8 Bit 255, bei 32 Bit aber 4294967295.
  • Eine logische Verschiebung auf eine vorzeichenbehaftete Zahl anwenden und eine Division erwarten: Negative Zahlen brauchen die arithmetische.
  • In JavaScript & und | auf Zahlen über 32 Bit anwenden: Sie werden stillschweigend abgeschnitten. Für 64 Bit braucht es BigInt.

Häufige Fragen

Was ist der Unterschied zwischen >> und >>>?

Beide verschieben nach rechts. >> ist arithmetisch und kopiert das Vorzeichenbit, negative Zahlen bleiben also negativ; >>> ist logisch, schiebt Nullen nach und behandelt die Zahl als vorzeichenlos.

Wozu dient XOR?

Zum Tauschen oder Vergleichen von Bits: A XOR B zeigt, welche Bits sich unterscheiden, A XOR A ergibt 0 und A XOR B XOR B wieder A. Deshalb steckt es in Prüfsummen, Paritätsbits und vielen Chiffren.

Wie prüfe ich, ob ein Bit gesetzt ist?

Mit einem AND zwischen der Zahl und einer Maske, in der nur dieses Bit 1 ist: Ist das Ergebnis nicht null, ist das Bit gesetzt. Bit k hat die Maske 1 << k.

So funktioniert diese Berechnung

Jede Operation wirkt auf die Bits derselben Stelle: AND = 1, wenn beide 1 sind, OR = 1, wenn mindestens eines 1 ist, XOR = 1, wenn sie verschieden sind, NOT kehrt um. A << n = A · 2^n, abgeschnitten auf die Breite w; A >>> n = ⌊A / 2^n⌋ vorzeichenlos; A >> n teilt unter Erhalt des Vorzeichens. Linksrotation um n ist (A << n) OR (A >>> (w − n)). Der vorzeichenbehaftete Wert ist der vorzeichenlose minus 2^w, wenn das oberste Bit 1 ist.