Bitwise-Rechner
Führen Sie bitweise Operationen auf Ganzzahlen durch und sehen Sie die Ergebnisse in Dezimal, Hex und Binär.
So funktioniert es
- Zwei Zahlen eingeben: Geben Sie die Werte ein, mit denen operiert werden soll, in Dezimal, Binär (Präfix 0b) oder Hexadezimal (Präfix 0x).
- Operation wählen: Wählen Sie AND, OR, XOR, NOT, Linksverschiebung (<<) oder Rechtsverschiebung (>>).
- Ergebnis ansehen: Die Ausgabe zeigt das Ergebnis gleichzeitig in Dezimal, Binär und Hex mit einer Visualisierung auf Bit-Ebene.
Warum die Bitweise-Calc nutzen?
Bitweise Operationen sind grundlegend in Systemprogrammierung, Kryptografie, Spieleentwicklung, Grafik, Netzwerk und eingebetteten Systemen. Zu verstehen, wie AND, OR, XOR und Verschiebungen einzelne Bits manipulieren, ist entscheidend für Aufgaben wie das Setzen/Löschen von Flags, das Packen von Daten in kompakte Formate und die Implementierung effizienter Algorithmen. Diese Calc zeigt die Operation auf Bit-Ebene, sodass Sie genau sehen, wie jedes Bit beeinflusst wird.
Funktionen
- Alle bitweisen Operatoren: AND (&), OR (|), XOR (^), NOT (~), Linksverschiebung (<<) und Rechtsverschiebung (>>).
- Mehrere Eingabe-Basen: Geben Sie Zahlen in Dezimal, Binär (0b…) oder Hexadezimal (0x…) ein.
- Mehrere Ausgabe-Basen: Ergebnisse werden gleichzeitig in Dezimal, Binär und Hexadezimal angezeigt.
- Bit-Visualisierung: Ein visuelles Bit-Raster zeigt, welche Bits für jeden Operanden und das Ergebnis gesetzt sind.
- Signed-/Unsigned-Modi: Schalten Sie zwischen 8-, 16-, 32- und 64-Bit-Ganzzahlbreiten um.
Häufige Fragen
Wofür wird XOR in der Programmierung verwendet?
XOR (^) wird zum Umschalten von Bits verwendet, für einfache Verschlüsselung/Verschleierung, Tausch-Operationen ohne Hilfsvariable, Paritätsprüfungen und Hash-Mischung. Es liefert 1, wenn sich Bits unterscheiden, und 0, wenn sie gleich sind.
Was ist der Unterschied zwischen << und >>?
Linksverschiebung (<<) verschiebt alle Bits nach links (entspricht der Multiplikation mit Zweierpotenzen. Rechtsverschiebung (>>) verschiebt Bits nach rechts) entspricht der Division durch Zweierpotenzen. Die arithmetische Rechtsverschiebung erhält das Vorzeichenbit; die logische Rechtsverschiebung füllt mit Nullen auf.
Wie setze oder lösche ich ein bestimmtes Bit?
Bit n setzen: value |= (1 << n). Bit n löschen: value &= ~(1 << n). Bit n umschalten: value ^= (1 << n). Prüfen, ob Bit n gesetzt ist: (value & (1 << n)) !== 0.
Von der booleschen Algebra zum Silizium: wie bitweise Operationen universell wurden
Die bitweisen Operationen, die jede moderne CPU implementiert, kommen aus zwei grundlegenden Arbeiten, die mehr als 80 Jahre auseinander veröffentlicht wurden. Im Jahr 1854 veröffentlichte George Boole «An Investigation of the Laws of Thought» und definierte die Algebra der zweiwertigen Logik, AND, OR, NOT und ihre Identitäten. Es war eine philosophische Arbeit, keine technische. Dann im Jahr 1937 schrieb ein 21-jähriger MIT-Masterstudent namens Claude Shannon seine Masterarbeit «A Symbolic Analysis of Relay and Switching Circuits» und bewies, dass die boolesche Algebra elektrische Relaisschaltungen beschreiben konnte und daher jede logische Berechnung physikalisch implementiert werden konnte. Diese Arbeit wird weithin als die wichtigste Masterarbeit des 20. Jahrhunderts zitiert und ist die Grundlage aller digitalen Elektronik. Das Zweierkomplement, die binäre Darstellung für negative Zahlen, die jede CPU verwendet, wurde 1962 von Burroughs Corporation patentiert, war aber bereits im IBM 704 (1954) und anderen frühen Maschinen verwendet worden. IEEE 754 standardisierte die Fließkommadarstellung im Jahr 1985 und legte das Bit-Layout fest, das jeder JavaScript-Number noch verwendet, 1 Vorzeichenbit, 11 Exponent, 52 Mantisse für binary64. Heute werden die C-Sprachoperatoren & | ^ ~ << >> fast direkt auf einzelne CPU-Anweisungen abgebildet, weshalb bitweiser Code dramatisch schneller sein kann als das arithmetische Äquivalent.
Die sechs Operatoren, was sie auf Bitebene tun
- AND (
&). Das Ergebnisbit ist nur dann 1, wenn beide Eingangsbits 1 sind.0b1100 & 0b1010 = 0b1000. Verwende es zum Maskieren, Isolieren bestimmter Bits oder Überprüfen, ob eine Flagge gesetzt ist:flags & FLAG_READist genau dann ungleich null, wennFLAG_READaktiv ist. - OR (
|). Das Ergebnisbit ist 1, wenn eines der Eingangsbits 1 ist.0b1100 | 0b1010 = 0b1110. Verwende es zum Setzen von Bits, Kombinieren von Flaggen:flags = FLAG_READ | FLAG_WRITE. - XOR (
^). Das Ergebnisbit ist 1, wenn genau ein Eingangsbit 1 ist.0b1100 ^ 0b1010 = 0b0110. Verwende es zum Umschalten von Bits, einfacher Verschleierung (x ^ x = 0, also ist XOR seine eigene Inverse), Parität und Hash-Mischung. - NOT (
~). Jedes Bit umdrehen.~0b0000_1111 = 0b1111_0000(in 8 Bit). Im Zweierkomplement entspricht~x-x − 1, also~5 === -6in JavaScript. - Linksverschiebung (
<<). Alle Bits um n Positionen nach links verschieben, rechts mit Nullen auffüllen.1 << 3 === 8, äquivalent zur Multiplikation mit 2³. Nützlich zum Erstellen von Bitmasken:1 << nist «das Bit an Position n». - Rechtsverschiebung (
>>arithmetisch,>>>logisch). Bits nach rechts verschieben. Arithmetische Verschiebung (>>in JS, Java, C mit Vorzeichen) bewahrt das Vorzeichenbit; logische Verschiebung (>>>in JS,>>in C ohne Vorzeichen) füllt mit Nullen.-8 >> 1 === -4, aber-8 >>> 1 === 2147483644in JavaScript, weil>>>zuerst zu einem vorzeichenlosen 32-Bit-Integer zwingt.
Wo bitweise tatsächlich seinen Wert beweist
- Bit-Flaggen und Feature-Toggles. Packe 32 boolesche Optionen in einen einzigen Integer. Linux-Dateiberechtigungen (
chmod 755), Netzwerkprotokoll-Header (TCP, IPv4) und OpenGL-Statusflaggen verwenden alle dieses Muster. Eine&-Prüfung sagt dir, ob ein Feature aktiviert ist. - Unix-Dateiberechtigungen.
rwxr-xr-xist0b111_101_101 = 0o755 = 493. Die drei Gruppen sind Benutzer/Gruppe/Andere, jede drei Bits sind read/write/execute. Der chmod-Rechner verwandelt die symbolische Form in den Integer, den deine Shell will. - IP-Subnetzmasken. Eine
/24-Maske ist255.255.255.0oder0xFFFFFF00. Um zu prüfen, ob eine IP in einem Subnetz ist:(ip & mask) === (network & mask). Wird von jedem Router und jeder Firewall der Welt verwendet. - Kryptographie und Hashing. SHA-256, AES, ChaCha20, BLAKE3, jeder moderne Hash und jede Chiffre wird hauptsächlich aus AND, OR, XOR, NOT und Rotationen aufgebaut. XOR allein ist die Grundlage der One-Time-Pads, die nachweislich unzerbrechlich sind, wenn der Schlüssel wirklich zufällig und einmal verwendet wird.
- Farbmanipulation. Eine 32-Bit-RGBA-Farbe packt vier 8-Bit-Kanäle:
(R << 24) | (G << 16) | (B << 8) | A. Um den Rotkanal zu extrahieren:(color >> 24) & 0xFF. Wird von HTML-Canvas, OpenGL und jedem Bildformat verwendet. - Performance-Tricks.
x & 1ist viel schneller alsx % 2auf den meisten CPUs (ein Zyklus vs ~10).x >> 1dividiert durch 2 in einem Zyklus. Zweierpotenz-Ausrichtung, Bit-Populationszählungen und Bit-Tüfteleien sind überall in performance-kritischem Code. (Siehe Sean Andersons «Bit Twiddling Hacks»-Seite für einen berühmten Katalog.) - Eingebettete Systeme. Mikrocontroller ordnen Hardwareregister bestimmten Bitpositionen im Speicher zu. Eine UART oder einen GPIO-Pin zu konfigurieren erfordert Maskieren und Verschieben, um die richtigen Bits zu lesen oder zu schreiben, ohne den Rest zu stören. Die Bitfeld-Syntax von C ist bequemer Zucker für diese Muster.
Fehler, die zubeißen
- Verwechslung von
&mit&&und|mit||. Die einfachen Formen sind bitweise, die doppelten sind Kurzschluss-Logik.1 & 2 === 0(keine gemeinsamen Bits), aber1 && 2 === 2(beide truthy, gibt das zweite zurück). Sie zu vermischen bricht stillschweigend die bedingte Logik. - Vorrangs-Überraschungen.
x & FLAG === 0bedeutetx & (FLAG === 0), nicht(x & FLAG) === 0, weil===enger bindet als&. Klammere immer bitweise Ausdrücke in Bedingungen. - Vorzeichen-vs-vorzeichenlos-Verschiebung-Verwirrung. In JavaScript ist
>>arithmetisch (Vorzeichenerweiterung),>>>ist logisch (Null-Füllung). C unterscheidet anhand des Variablentyps, vorzeichenbehaftete Typen verwenden arithmetisch, vorzeichenlose verwenden logisch. Java hat sowohl>>als auch>>>wie JavaScript. Mit der Sprachkonvention nicht übereinzustimmen flippt stillschweigend die Bedeutung um. - JavaScript verkürzt bitweise Ops auf 32 Bit. Obwohl
Numberein 64-Bit-Float ist, zwingen alle bitweisen Operatoren Operanden zuerst zu int32.0x100000000 & 0xFF === 0, nicht 0 + das niedrige Byte, weil der Operand vor dem AND auf 32 Bit verkürzt wird. Für 64-Bit-Bitmanipulation verwendeBigInt, das eigene bitweise Operatoren hat. - Verschieben um > 31 in JavaScript.
1 << 32 === 1, nicht 0. Die Verschiebungsmenge wird modulo 32 genommen. C ist noch gefährlicher: das Verschieben um mehr als die Bitbreite ist undefiniertes Verhalten, also können Compiler alles tun. Prüfe immern < bitWidth, bevor du um einen Laufzeitwert verschiebst. - Endianness in Byte-Packing-Code.
(r << 24) | (g << 16) | (b << 8) | aerzeugt0xRRGGBBAA. Ob Bytes in dieser Reihenfolge oder im Speicher umgekehrt gespeichert werden, hängt von der Plattform ab. ImageData in HTML-Canvas ist little-endian auf x86; das PNG-Dateiformat ist big-endian. Konvertiere explizit mitDataView, wenn du Binärformate liest. - Zweierkomplement vergessen.
~0 === -1, nicht0xFFFFFFFF, weil alle-Einsen die Zweierkomplement-Kodierung von −1 ist. Um die vorzeichenlose 32-Bit-Interpretation in JavaScript zu erhalten:(~0) >>> 0 === 4294967295.
Warum Zweierkomplement, und was es auf Bitebene bedeutet
Jede moderne CPU stellt negative Ganzzahlen mit Zweierkomplement dar. In einem vorzeichenbehafteten 8-Bit-Byte werden die Werte 0 bis 127 als Binär 0000_0000 bis 0111_1111 kodiert. Dann wird −1 als 1111_1111 kodiert, −2 als 1111_1110, bis hinab zu −128 als 1000_0000. Der Grund: mit dieser Kodierung funktioniert die Addition auf die gleiche Weise, egal ob die Eingaben vorzeichenbehaftet oder vorzeichenlos sind, die CPU benötigt keine getrennten add-signed- und add-unsigned-Anweisungen. Die Asymmetrie ist, dass der negative Bereich eins größer ist als der positive (in 8 Bit, −128 bis +127), weshalb Math.abs(INT_MIN) in jeder Sprache mit Ganzzahlen fester Breite überläuft. Die früheren Vorzeichen-Betrag- (ein Bit für das Vorzeichen, Rest für die Größe) und Einerkomplement-Kodierungen existierten in den 1950er-60er Jahren, verloren aber gegen das Zweierkomplement, weil sie zwei Darstellungen von Null hatten und für die Negation Sonderfall-Hardware benötigten.
Weitere häufig gestellte Fragen
Warum ist ~5 gleich -6 statt 250?
Weil im Zweierkomplement (der Kodierung, die jede moderne CPU verwendet) das Umdrehen jedes Bits einer positiven Zahl -n - 1 ergibt. Also ~5 === -6 und ~0 === -1. In einem vorzeichenlosen 8-Bit-Kontext würde dasselbe Bitmuster wie ~5 (Binär 1111_1010) 250 repräsentieren. JavaScript behandelt das Ergebnis als vorzeichenbehaftet 32-Bit, also siehst du -6. Um die vorzeichenlose Interpretation zu erhalten: (~5) >>> 0 in 32 Bit, was 4294967290 ergibt, oder mit ~5 & 0xFF auf 8 Bit maskieren, was 250 ergibt.
Ist XOR wirklich eine Verschlüsselung?
XOR ist der Baustein jeder modernen symmetrischen Chiffre, aber XOR allein ist keine sichere Verschlüsselung. Ein One-Time-Pad, XOR mit einem wirklich zufälligen Schlüssel so lang wie die Nachricht, genau einmal verwendet, ist informationstheoretisch unzerbrechlich (Shannon, 1949). Den Schlüssel wiederverwenden oder einen Schlüssel kürzer als die Nachricht verwenden, und die Frequenzanalyse bricht ihn trivial. Echte Chiffren wie AES verwenden XOR plus Diffusion und Substitution, um einen kurzen Schlüssel in einen Strom von pseudozufälligen Bytes zu verstärken, der für jeden ohne den Schlüssel wie ein One-Time-Pad aussieht. Also «mit XOR verschlüsseln» ist nur für triviale Verschleierung in Ordnung, niemals für echte Geheimnisse.
Wann sollte ich BigInt statt Number für Bitmanipulation verwenden?
Immer wenn du mehr als 32 Bit bitweise Präzision brauchst. JavaScript-Bitweisen-Operatoren verkürzen Number-Operanden zu vorzeichenbehafteten 32-Bit-Ganzzahlen vor der Berechnung. Wenn du 64-Bit-Masken brauchst (z.B. Manipulation einer 64-Bit-Feature-Flagge-Set, Arbeit mit Linux-mmap-Offsets oder Implementierung von SHA-512), verwende BigInt: 0xFFFFFFFFFFFFFFFFn & 0xFFn === 255n. BigInt ist langsamer als Number, ~3-10× je nach Operation, also reserviere es für die Fälle, in denen 32 Bit wirklich zu wenig sind.
Wie zähle ich die Anzahl der 1-Bits in einer Zahl?
Das ist die Populationszählung oder das Hamming-Gewicht. Die meisten modernen CPUs haben eine einzige Anweisung dafür (POPCNT auf x86, VCNT auf ARM). In JavaScript kein eingebautes, also verwende den Bit-Tüftelei-Klassiker: let c = 0; while (x) { c += x & 1; x >>>= 1; }. Oder den parallelen SWAR-Trick aus Hackers Delight: x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; return (x * 0x01010101) >>> 24;, der die Bits in einer 32-Bit-Ganzzahl in etwa einem Dutzend Zyklen zählt.
Werden meine Daten irgendwohin gesendet, wenn ich diesen Rechner verwende?
Nein. Jede Operation läuft in der JavaScript-Engine deines Browsers, während einer Berechnung passieren keine Netzwerkaufrufe. Öffne den Netzwerk-Tab in DevTools und klicke Berechnen, du wirst null ausgehende Anfragen sehen. Sicher für sensible Masken, Schlüssel oder proprietäre Bit-Layout-Arbeit.