Start · Sprachen · JavaScript · Referenz · Linksverschiebung (<<)

Linksverschiebung (<<)

Operator

Der Linksverschiebungsoperator <code>&lt;&lt;</code> verschiebt die Bits eines Integers um <code>b</code> Stellen nach links und füllt rechts mit Nullen auf.

seit JavaScript ES1 Kategorie: syntax

Signatur

a << b

Beschreibung

Der Linksverschiebungsoperator (<<) ist ein binärer bitweiser Operator, der die Bits des linken Operanden a um die durch b angegebene Anzahl von Stellen nach links verschiebt. Jede verschobene Stelle entspricht einer Multiplikation mit 2, sodass x << n äquivalent zu x * 2n ist – solange kein Überlauf entsteht.

Beide Operanden werden vor der Operation intern in vorzeichenbehaftete 32-Bit-Integer umgewandelt (ToInt32). Das Ergebnis ist ebenfalls ein vorzeichenbehafteter 32-Bit-Integer. Von b werden nur die untersten 5 Bits ausgewertet (Werte 0–31), ein Schiebeweite von 32 oder mehr wird also auf den Modulo-32-Wert reduziert.

Der Operator eignet sich besonders für Performance-optimierte Ganzzahlarithmetik, Bitmasken und Flags. Typische Anwendungsfälle sind das Setzen einzelner Bits in einem Flags-Register, schnelle Potenzen-von-2-Multiplikationen oder die Kodierung mehrerer Werte in eine einzige Zahl (Bit-Packing).

Zu beachten ist, dass der Operator ausschließlich auf 32-Bit-Ebene arbeitet. Werte außerhalb des Bereichs –2 147 483 648 bis 2 147 483 647 werden abgeschnitten. Für sehr große Zahlen sollte stattdessen BigInt in Kombination mit dem gleichen Operator verwendet werden, da BigInt-Varianten beliebig breite Verschiebungen unterstützen.

Parameter

Name Typ Default Beschreibung
$a Pflicht number | bigint Der Wert, dessen Bits nach links verschoben werden sollen. Wird intern in einen vorzeichenbehafteten 32-Bit-Integer (bzw. BigInt) umgewandelt.
$b Pflicht number | bigint Anzahl der Bit-Positionen, um die verschoben wird. Nur die untersten 5 Bits (0–31) werden ausgewertet; bei BigInt muss die Schiebeweite nicht-negativ sein.

Rückgabewert

Typ
number | bigint
Beschreibung
Das Ergebnis der Linksverschiebung als vorzeichenbehafteter 32-Bit-Integer (number) bzw. als BigInt, wenn beide Operanden BigInt sind.

Beispiele

Grundlegende Linksverschiebung

// 1 in Binär: 00000000 00000000 00000000 00000001
// Nach 3 Stellen links: 00000000 00000000 00000000 00001000 = 8
console.log(1 << 3);   // 8
console.log(5 << 1);   // 10  (5 * 2)
console.log(5 << 2);   // 20  (5 * 4)
console.log(1 << 0);   // 1   (keine Verschiebung)
8 10 20 1

Bit-Flags mit Linksverschiebung setzen und prüfen

// Berechtigungen als Bit-Flags
const LESEN    = 1 << 0; // 0001 = 1
const SCHREIBEN = 1 << 1; // 0010 = 2
const AUSFUEHREN = 1 << 2; // 0100 = 4

const berechtigungen = LESEN | SCHREIBEN; // 0011 = 3

const kannLesen     = (berechtigungen & LESEN)     !== 0;
const kannSchreiben = (berechtigungen & SCHREIBEN) !== 0;
const kannAusfuehren = (berechtigungen & AUSFUEHREN) !== 0;

console.log(`Lesen:     ${kannLesen}`);
console.log(`Schreiben: ${kannSchreiben}`);
console.log(`Ausführen: ${kannAusfuehren}`);
Lesen: true Schreiben: true Ausführen: false

Schnelle Multiplikation mit Potenzen von 2

const verdoppeln  = x => x << 1;
const vervierfachen = x => x << 2;
const mal256       = x => x << 8;

console.log(verdoppeln(7));    // 14
console.log(vervierfachen(3)); // 12
console.log(mal256(1));        // 256
14 12 256

Linksverschiebung mit BigInt

// BigInt erlaubt Verschiebungen über 31 Stellen hinaus
const gross = 1n << 40n;
console.log(gross);           // 1099511627776n
console.log(typeof gross);    // bigint
1099511627776n bigint

// Wichtig · Fallstricke

32-Bit-Beschränkung: Da beide Operanden (bei number) intern in vorzeichenbehaftete 32-Bit-Integer umgewandelt werden, gehen Bits oberhalb von Bit 31 verloren. 2147483647 << 1 ergibt z. B. -2 (Überlauf).

  • Schiebeweite ≥ 32: Nur die untersten 5 Bits der Schiebeweite werden verwendet — x << 32 ist also identisch mit x << 0.
  • Gemischte Typen: number und BigInt können nicht gemischt werden. 1 << 2n wirft einen TypeError.
  • Negative Schiebeweiten bei BigInt: Eine negative Schiebeweite ist bei BigInt nicht erlaubt und führt zu einem RangeError. Für Rechtsverschiebung bei BigInt den Operator >> verwenden.
  • Performance: In modernen JavaScript-Engines sind Bit-Operationen auf number oft schneller als allgemeine arithmetische Operationen, da die Engine intern direkt mit 32-Bit-Integern arbeiten kann.