Start · Sprachen · JavaScript · Referenz · Bitweises NICHT (~)

Bitweises NICHT (~)

Operator

Der bitweise NICHT-Operator (<code>~</code>) invertiert alle Bits eines Zahlen- oder BigInt-Werts und gibt das bitweise Komplement zurück.

seit JavaScript ES1 Kategorie: syntax

Signatur

~operand

Beschreibung

Der bitweise NICHT-Operator (~) ist ein unärer Operator, der auf seinen Operanden angewendet wird und jedes einzelne Bit invertiert: Nullen werden zu Einsen und Einsen zu Nullen. Bei normalen JavaScript-Zahlen wird der Operand zunächst in einen vorzeichenbehafteten 32-Bit-Ganzzahlwert (Int32) umgewandelt. Das Ergebnis dieser Bit-Invertierung entspricht mathematisch immer -(n + 1), wobei n der ursprüngliche Ganzzahlwert ist.

Ein klassischer Anwendungsfall ist die Prüfung, ob ein Element in einem Array oder ein Teilstring in einem String enthalten ist: Da indexOf() den Wert -1 zurückgibt, wenn nichts gefunden wurde, und ~(-1) den Wert 0 (also falsy) ergibt, kann ~arr.indexOf(x) als kompakte Wahrheitsprüfung genutzt werden. Alle anderen Rückgabewerte von indexOf() ergeben durch ~ einen truthy-Wert.

Der Operator unterstützt seit ES2020 auch BigInt-Werte. Dabei findet keine Konvertierung in Int32 statt; die Bits werden direkt in der arbiträr langen Darstellung invertiert. Wichtig: ~ kann nicht auf einen Mix aus Number und BigInt angewendet werden — beide Seiten müssen denselben Typ haben.

In modernem Code wird ~indexOf() häufig durch includes() ersetzt, da Letzteres klarer und lesbarer ist. Der Operator bleibt dennoch nützlich für Low-Level-Bitmanipulationen, z. B. in Masken, Flags, Grafik- oder Kryptografie-Algorithmen.

Parameter

Name Typ Default Beschreibung
$operand Pflicht number|bigint Der Wert, dessen Bits invertiert werden sollen. Normale Zahlen werden intern in einen vorzeichenbehafteten 32-Bit-Integer umgewandelt. BigInt-Werte werden direkt verarbeitet.

Rückgabewert

Typ
number|bigint
Beschreibung
Das bitweise Komplement des Operanden. Bei Number-Werten immer ein vorzeichenbehafteter 32-Bit-Integer (entspricht -(n + 1)). Bei BigInt ein BigInt-Wert.

Beispiele

Grundlegende Bit-Invertierung

console.log(~0);    // -1  (0b00...000 → 0b11...111)
console.log(~1);    // -2
console.log(~-1);   //  0
console.log(~255);  // -256
console.log(~42);   // -43  (entspricht -(42 + 1))
-1 -2 0 -256 -43

Enthaltensein prüfen mit ~indexOf()

const fruits = ['Apfel', 'Banane', 'Kirsche'];

// Klassische Variante mit ~indexOf (kompakt, aber weniger lesbar)
if (~fruits.indexOf('Banane')) {
  console.log('Banane gefunden!');
}

// ~(-1) ergibt 0 → falsy → Element nicht vorhanden
if (!~fruits.indexOf('Mango')) {
  console.log('Mango nicht im Array.');
}

// Moderne, bevorzugte Alternative:
if (fruits.includes('Kirsche')) {
  console.log('Kirsche gefunden (mit includes).');
}
Banane gefunden! Mango nicht im Array. Kirsche gefunden (mit includes).

Bitweise Maske mit dem ~-Operator

// Flags als Bitmaske: einzelne Bits ein- und ausschalten
const FLAG_READ    = 0b001; // 1
const FLAG_WRITE   = 0b010; // 2
const FLAG_EXECUTE = 0b100; // 4

let permissions = FLAG_READ | FLAG_WRITE | FLAG_EXECUTE; // alle Rechte: 7
console.log(permissions.toString(2)); // '111'

// WRITE-Bit löschen mit ~
permissions &= ~FLAG_WRITE;
console.log(permissions.toString(2)); // '101' → READ + EXECUTE
111 101

Verwendung mit BigInt

const big = 42n;
console.log(~big); // -43n

const negOne = -1n;
console.log(~negOne); // 0n
-43n 0n

// Wichtig · Fallstricke

32-Bit-Beschränkung bei Number: Zahlen außerhalb des 32-Bit-Integer-Bereichs (±2 147 483 647) werden vor der Invertierung auf Int32 gekürzt. Das kann zu unerwarteten Ergebnissen führen, z. B.: ~(2**32) ergibt -1, weil 2**32 als Int32 den Wert 0 hat.

Typ-Mischung verboten: ~ auf einen BigInt anzuwenden, während die restliche Berechnung Numbers verwendet (oder umgekehrt), wirft einen TypeError. Immer sicherstellen, dass der Operand konsistent einen Typ hat.

Lesbarkeit: Der Trick ~arr.indexOf(x) ist in älteren Codebasen verbreitet, gilt aber als schwer lesbar. Bevorzuge arr.includes(x) (ES2016) bzw. str.includes(substr) für String-Prüfungen, sofern kein IE-Support erforderlich ist.