Die Wahrheitstafel der bitweisen Operationen verstehen
Jede logische bitweise Operation folgt einer festen Wahrheitstafel, die unabhängig auf jedes Paar einander entsprechender Bitstellen angewandt wird.
| Bit A | Bit B | AND | OR | XOR |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
- Dieser Rechner begrenzt die Eingaben auf den Bereich einer vorzeichenbehafteten 32-Bit-Ganzzahl (0 bis 2.147.483.647), da die bitweisen Operatoren in JavaScript ihre Operanden gemäß der ECMAScript-Spezifikation vor der Ausführung intern in 32-Bit-Darstellungen umwandeln.
- NOT (~A) liefert stets ein Ergebnis, das als vorzeichenbehaftete 32-Bit-Ganzzahl gelesen −(A + 1) entspricht — dieser Rechner zeigt den vorzeichenlosen 32-Bit-Wert an (so erscheint ~12 als 4.294.967.283 und nicht als −13), damit die dargestellte Binärform eindeutig bleibt.
- Verschiebeweiten (B) über 31 werden von diesem Rechner auf 31 begrenzt, da eine Verschiebung eines 32-Bit-Werts um 32 oder mehr Stellen in JavaScript umläuft (es werden nur die untersten 5 Bits der Verschiebeweite genutzt), statt wie intuitiv erwartet 0 zu ergeben.
Was sind bitweise Operationen?
Eine bitweise Operation verarbeitet eine Zahl auf der Ebene ihrer einzelnen Binärziffern (Bits), indem sie die Nullen und Einsen ihrer Darstellung zur Basis 2 vergleicht oder verschiebt, statt gewöhnlich im Dezimalsystem zu rechnen. Jede ganze Zahl lässt sich binär als Folge von Bits schreiben, von denen jedes eine Zweierpotenz darstellt — so lautet 12 binär 1100, also 1×8 + 1×4 + 0×2 + 0×1.
Die logischen bitweisen Operationen — AND, OR, XOR (exklusives Oder) und NOT — vergleichen einander entsprechende Bitstellen zweier Zahlen oder kehren die Bits einer Zahl um, und zwar nach den üblichen Regeln der booleschen Logik, unabhängig auf jede Bitstelle angewandt. Die Verschiebeoperationen — Links- und Rechtsverschiebung — versetzen sämtliche Bits einer Zahl um eine angegebene Anzahl von Stellen nach links oder rechts, was mathematisch einer Multiplikation oder Division mit einer Zweierpotenz entspricht.
Bitweise Operationen sind für die Informatik und die maschinennahe Programmierung grundlegend: Sie dienen dazu, einzelne Schalter in einer Menge von Optionen zu setzen, zu löschen und abzufragen (Bit-Flags), zur schnellen Multiplikation und Division mit Zweierpotenzen, in kryptografischen Verfahren, in der Grafik- und Farbverarbeitung (Zusammenführen der Rot-, Grün- und Blaukanäle) sowie zur kompakten Datenkodierung.
So verwenden Sie diesen Rechner für bitweise Operationen
- Geben Sie die erste Zahl (A) als nichtnegative ganze Zahl ein (0 bis 2.147.483.647, dem Bereich einer vorzeichenbehafteten 32-Bit-Ganzzahl).
- Geben Sie die zweite Zahl (B) ein. Bei AND, OR und XOR ist dies der zweite Operand, der Bit für Bit mit A verglichen wird. Bei den Verschiebeoperationen ist es die Anzahl der zu verschiebenden Stellen (wirksam sind 0 bis 31; größere Werte werden auf 31 begrenzt). Bei NOT bleibt B unberücksichtigt, da NOT allein auf A wirkt.
- Wählen Sie die Operation: AND, OR, XOR, NOT, Linksverschiebung oder Rechtsverschiebung.
- Lesen Sie das dezimale Ergebnis sowie die Binärdarstellung von A, von B (bzw. der Verschiebeweite) und des Ergebnisses ab.
So arbeitet jede bitweise Operation
AND vergleicht jede Bitstelle und liefert nur dort eine 1, wo beide Bits 1 sind, andernfalls 0. Rechenbeispiel: 12 (1100) AND 10 (1010) = 8 (1000), da allein die dritte Bitstelle (Wertigkeit 8) in beiden Zahlen 1 ist.
OR vergleicht jede Bitstelle und liefert dort eine 1, wo mindestens eines der beiden Bits 1 ist. Rechenbeispiel: 12 (1100) OR 10 (1010) = 14 (1110). XOR (exklusives Oder) liefert dort eine 1, wo genau eines der beiden Bits 1 ist, jedoch nicht beide. Rechenbeispiel: 12 (1100) XOR 10 (1010) = 6 (0110).
NOT kehrt jedes Bit einer einzelnen Zahl um (aus 0 wird 1, aus 1 wird 0). Da dieser Rechner mit 32-Bit-Werten arbeitet, kippt NOT 12 alle 32 Bits und ergibt 4.294.967.283, sofern der Wert als vorzeichenlose 32-Bit-Ganzzahl gelesen wird (bzw. die Zweierkomplementdarstellung von −13, sofern er als vorzeichenbehaftet gelesen wird).
Die Linksverschiebung (A << B) versetzt jedes Bit von A um B Stellen nach links und füllt die frei gewordenen niederwertigen Stellen mit 0 auf — dies entspricht einer Multiplikation von A mit 2^B. Rechenbeispiel: 12 << 2 = 48 (gleichbedeutend mit 12 × 2² = 12 × 4 = 48). Die Rechtsverschiebung (A >> B) versetzt jedes Bit von A um B Stellen nach rechts und verwirft die niederwertigen Bits — dies entspricht einer abgerundeten ganzzahligen Division von A durch 2^B. Rechenbeispiel: 12 >> 2 = 3 (gleichbedeutend mit ⌊12 ÷ 4⌋ = 3).
Häufige Fehler
- Bitweises AND bzw. OR mit dem logischen (booleschen) AND bzw. OR verwechseln — bitweise Operatoren wirken unabhängig auf jedes Bit einer Zahl, während logische Operatoren den gesamten Wert als eine einzige Wahr-Falsch-Bedingung behandeln; beide liefern außer im Sonderfall der Werte 0 und 1 unterschiedliche Ergebnisse.
- Erwarten, dass eine Linksverschiebung um einen großen Betrag stets eine entsprechend größere Zahl liefert — wird weit genug verschoben, so können bedeutsame Bits über die 32-Bit-Grenze hinausgeschoben und dabei verworfen werden (Überlauf).
- Das Ergebnis von NOT falsch deuten — da NOT jedes der 32 Bits kippt, wirkt das vorzeichenlose Dezimalergebnis von ~A weit größer als A selbst, obwohl es im Zweierkomplement als vorzeichenbehaftete Zahl tatsächlich die kleine negative Zahl −(A+1) darstellt.
- Die Rechtsverschiebung stets mit einer gewöhnlichen Division gleichsetzen — bei nichtnegativen ganzen Zahlen entspricht sie exakt der abgerundeten ganzzahligen Division durch eine Zweierpotenz, bei negativen Zahlen hängt das Verhalten hingegen davon ab, ob arithmetisch oder logisch verschoben wird.
Häufig gestellte Fragen
Worin unterscheiden sich bitweises AND und logisches AND?
Das bitweise AND (&) vergleicht zwei Zahlen Bit für Bit und liefert eine neue Zahl, in der jedes Bit nur dann 1 ist, wenn beide entsprechenden Eingabebits 1 sind — so gilt etwa 12 & 10 = 8. Das logische AND (&&) behandelt jeden Wert als eine einzige Wahr-Falsch-Bedingung und gibt einen der ursprünglichen Operanden oder einen booleschen Wert zurück, bewertet also die Wahrheit statt einzelne Bits zu verknüpfen. Beide Operatoren verfolgen verschiedene Zwecke und liefern in der Regel sehr unterschiedliche Ergebnisse.
Wie arbeitet XOR?
XOR (exklusives Oder) vergleicht zwei Zahlen Bit für Bit und liefert an jeder Stelle eine 1, an der genau eines der beiden entsprechenden Bits 1 ist, also weder beide noch keines. Für 12 (1100) XOR 10 (1010) ergibt der Vergleich der Bitstellen 0110, dezimal also 6. XOR wird häufig verwendet, um Bits umzuschalten, Unterschiede zwischen zwei Werten zu erkennen sowie in einfachen Prüfsummen- und Paritätsberechnungen.
Was bewirkt eine Linksverschiebung?
Eine Linksverschiebung (A << B) versetzt jedes Bit der Binärdarstellung von A um B Stellen nach links und füllt die frei gewordenen niederwertigen Stellen mit Nullen auf. Mathematisch entspricht dies einer Multiplikation von A mit 2 hoch B. So ergibt etwa 12 << 2 den Wert 48, dasselbe Ergebnis wie 12 × 2² = 12 × 4 = 48.
Was bewirkt das bitweise NOT?
Das bitweise NOT (~A) kehrt jedes Bit von A um — aus jeder 0 wird eine 1 und aus jeder 1 eine 0. Angewandt auf die 32-Bit-Darstellung von 12 (00000000000000000000000000001100) liefert NOT einen Wert mit sämtlichen gekippten Bits, der als vorzeichenlose 32-Bit-Zahl 4.294.967.283 anzeigt und als vorzeichenbehaftete Zahl im Zweierkomplement −13 darstellt, gemäß der Identität ~A = −(A+1).
Wie unterscheidet sich die Rechtsverschiebung von der Division?
Bei nichtnegativen ganzen Zahlen liefert eine Rechtsverschiebung (A >> B) genau dasselbe Ergebnis wie die abgerundete ganzzahlige Division durch 2^B: A >> B = ⌊A ÷ 2^B⌋. So gilt etwa 12 >> 2 = 3, übereinstimmend mit ⌊12 ÷ 4⌋ = 3. Bei negativen Zahlen können beide Operationen auseinanderlaufen, da die Art der Verschiebung (arithmetisch oder logisch) bestimmt, wie das Vorzeichenbit behandelt wird — ein Detail, das vor allem in maschinennahen Zusammenhängen bedeutsam ist.
Warum sind die bitweisen Operationen hier auf 32-Bit-Ganzzahlen beschränkt?
Die eingebauten bitweisen Operatoren in JavaScript (&, |, ^, ~, << und >>) wandeln ihre Operanden gemäß der ECMAScript-Sprachspezifikation vor der Ausführung intern in 32-Bit-Ganzzahlen um. Dieser Rechner bildet dieses Standardverhalten nach, weshalb die Eingaben auf den in 32 Bit darstellbaren Bereich begrenzt sind (0 bis 2.147.483.647 für die hier zugelassenen nichtnegativen Werte).
Quellenangaben
- Warren HS Jr. Hacker's Delight. 2nd ed. Addison-Wesley, 2012. (Standard reference for bitwise algorithms and two's-complement arithmetic.)
- ECMA International. ECMA-262: ECMAScript Language Specification, §6.1.6.1 (Bitwise operators, ToInt32/ToUint32). ecma-international.org.
- Patterson DA, Hennessy JL. Computer Organization and Design: The Hardware/Software Interface. 5th ed. Morgan Kaufmann, 2013. (Binary representation and bitwise logic.)