Start · Sprachen · JavaScript · Referenz · Bitweises XOR-Zuweisung (^=)

Bitweises XOR-Zuweisung (^=)

Operator

Der bitweise XOR-Zuweisungsoperator <code>^=</code> führt ein bitweises XOR auf zwei Operanden aus und weist das Ergebnis dem linken Operanden zu.

seit JavaScript ES1 Kategorie: syntax

Signatur

x ^= y

Beschreibung

Der Operator ^= kombiniert die bitweise XOR-Operation (^) mit einer Zuweisung in einem einzigen Ausdruck. Der Ausdruck x ^= y ist dabei äquivalent zu x = x ^ y. Das bitweise XOR vergleicht jeden Bit-Platz beider Operanden: Das Ergebnis-Bit ist 1, wenn genau eines der beiden Bits 1 ist, andernfalls 0.

Vor der Operation werden beide Operanden intern in vorzeichenbehaftete 32-Bit-Ganzzahlen (Int32) umgewandelt. Das Ergebnis ist ebenfalls eine 32-Bit-Ganzzahl und wird anschließend wieder in den JavaScript-Typ Number konvertiert. Dezimalstellen (Nachkommastellen) gehen dabei verloren.

Typische Anwendungsfälle sind das Umschalten (Togglen) einzelner Bits in Bitfeldern, einfache Prüfsummen, das Tauschen zweier Integer-Werte ohne Hilfsvariable sowie Aufgaben in der Low-Level-Programmierung, Kryptographie oder Spieleentwicklung.

  • Toggle-Bit: Ein bestimmtes Bit lässt sich mit einer Bitmaske zuverlässig umschalten: flags ^= 0b0100.
  • XOR-Swap: Zwei ganzzahlige Variablen können ohne Hilfsvariable getauscht werden: a ^= b; b ^= a; a ^= b;.
  • Zurücksetzen auf 0: x ^= x setzt x immer auf 0.

Parameter

Name Typ Default Beschreibung
$x Pflicht number | bigint Der linke Operand — eine Variable oder ein zuweisbarer Ausdruck (lvalue), dem das Ergebnis zugewiesen wird. Wird intern in eine vorzeichenbehaftete 32-Bit-Ganzzahl umgewandelt (außer bei BigInt).
$y Pflicht number | bigint Der rechte Operand — ein beliebiger Ausdruck, der zu einer Zahl ausgewertet wird. Wird ebenfalls intern in eine vorzeichenbehaftete 32-Bit-Ganzzahl umgewandelt (außer bei BigInt).

Rückgabewert

Typ
number | bigint
Beschreibung
Den neuen Wert von x nach der bitweisen XOR-Operation. Bei normalen Zahlen ist das Ergebnis eine vorzeichenbehaftete 32-Bit-Ganzzahl als Number. Bei BigInt-Operanden ein BigInt.

Beispiele

Einzelne Bits mit einer Bitmaske umschalten (Toggle)

// Bit 2 (Wert 4 = 0b0100) in einem Flags-Byte toggeln
let flags = 0b1010; // 10
flags ^= 0b0100;    // Bit 2 einschalten → 0b1110
console.log(flags.toString(2)); // "1110"

flags ^= 0b0100;    // Bit 2 wieder ausschalten → 0b1010
console.log(flags.toString(2)); // "1010"
1110 1010

XOR-Swap: Zwei Variablen ohne Hilfsvariable tauschen

let a = 42;
let b = 17;

a ^= b; // a = 42 ^ 17 = 59
b ^= a; // b = 17 ^ 59 = 42
a ^= b; // a = 59 ^ 42 = 17

console.log(a); // 17
console.log(b); // 42
17 42

Einfache Paritätsprüfung über ein Byte-Array

// XOR aller Bytes ergibt ein einfaches Prüfbyte
const bytes = [0x4A, 0x53, 0x2D, 0x58, 0x4F, 0x52];
let checksum = 0;
for (const byte of bytes) {
  checksum ^= byte;
}
console.log(checksum.toString(16)); // Prüfbyte als Hex
6f

Verwendung mit BigInt

let big = 0b1111n;
big ^= 0b1010n;
console.log(big); // 5n  (0b0101)
5n

// Wichtig · Fallstricke

32-Bit-Überlauf: Da beide Operanden intern als vorzeichenbehaftete 32-Bit-Ganzzahl behandelt werden, gehen Werte außerhalb des Bereichs -231 bis 231 − 1 nicht verloren — sie werden jedoch abgeschnitten (truncated). Fließkommazahlen wie 3.9 werden dabei zu 3 gekürzt.

Typumwandlung: Nicht-numerische Werte (z. B. null, undefined, Strings) werden vor der Operation zu einer Zahl konvertiert. null ergibt 0, undefined ergibt NaN → wird zu 0. Das kann zu unerwarteten Ergebnissen führen.

BigInt-Mischung verboten: Number und BigInt dürfen nicht gemischt werden — 5n ^= 2 wirft einen TypeError.

XOR-Swap-Fallstrick: Der XOR-Swap-Trick funktioniert nicht, wenn beide Variablen auf dasselbe Objekt/denselben Speicherplatz zeigen (a[i] ^= a[j] bei i === j würde die Variable auf 0 setzen).