Unsigned right shift (>>>)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Der unsigned right shift (>>>)-Operator gibt eine Zahl zurück, deren Binärdarstellung um die angegebene Anzahl von Bits nach rechts verschoben wird. Überschüssige Bits, die nach rechts verschoben werden, werden verworfen, und Nullen werden von links eingefügt. Diese Operation wird auch als "Nullfüllung-Rechtsverschiebung" bezeichnet, da das Vorzeichenbit 0 wird, sodass die resultierende Zahl immer positiv ist. Der unsigned right shift akzeptiert keine BigInt-Werte.

Probieren Sie es aus

Syntax

js
x >>> y

Beschreibung

Im Gegensatz zu anderen arithmetischen und bitweisen Operatoren akzeptiert der unsigned right shift-Operator keine BigInt-Werte. Dies liegt daran, dass er die linken Bits mit Nullen füllt, aber konzeptionell haben BigInts eine unendliche Anzahl führender Vorzeichenbits, sodass es kein "linkes Bit" gibt, das mit Nullen gefüllt werden kann.

Der Operator arbeitet auf der Bitdarstellung des linken Operanden im Zweierkomplement. Betrachten Sie die 32-Bit-Binärdarstellungen der Dezimalzahlen (Basis 10) 9 und -9:

     9 (base 10): 00000000000000000000000000001001 (base 2)
    -9 (base 10): 11111111111111111111111111110111 (base 2)

Die Binärdarstellung im Zweierkomplement der negativen Dezimalzahl -9 wird gebildet, indem alle Bits der entgegengesetzten Zahl umgekehrt werden, was 9 und 00000000000000000000000000001001 im Binärsystem entspricht, und 1 hinzugefügt wird.

In beiden Fällen wird das Vorzeichen der Binärzahl durch ihr linkes Bit angegeben: Für die positive Dezimalzahl 9 ist das linke Bit der Binärdarstellung 0, und für die negative Dezimalzahl -9 ist das linke Bit der Binärdarstellung 1.

Gegeben sind diese Binärdarstellungen der Dezimalzahlen 9 und -9:

Für die positive Zahl 9 ergibt die Nullfüllung-Rechtsverschiebung und die Vorzeichen-erhaltende Rechtsverschiebung das gleiche Ergebnis: 9 >>> 2 ergibt 2, dasselbe wie 9 >> 2:

      9 (base 10): 00000000000000000000000000001001 (base 2)
                   --------------------------------
9 >>  2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

Beachten Sie, wie zwei rechts liegende Bits, 01, verschoben wurden und zwei Nullen von links eingefüllt wurden.

Beachten Sie jedoch, was bei -9 passiert: -9 >> 2 (Vorzeichen-erhaltende Rechtsverschiebung) ergibt -3, aber -9 >>> 2 (Nullfüllung-Rechtsverschiebung) ergibt 1073741821:

      -9 (base 10): 11111111111111111111111111110111 (base 2)
                    --------------------------------
-9 >>  2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)

Beachten Sie, wie zwei rechts liegende Bits, 11, verschoben wurden. Für -9 >> 2 (Vorzeichen-erhaltende Rechtsverschiebung) wurden zwei Kopien des linken 1-Bits von links eingefügt, wodurch das negative Vorzeichen beibehalten wird. Andererseits wurden bei -9 >>> 2 (Nullfüllung-Rechtsverschiebung) stattdessen Nullen von links eingefüllt, sodass das negative Vorzeichen der Zahl nicht erhalten bleibt und das Ergebnis stattdessen eine (große) positive Zahl ist.

Wenn der linke Operand eine Zahl mit mehr als 32 Bits ist, werden die signifikantesten Bits verworfen. Zum Beispiel wird die folgende Ganzzahl mit mehr als 32 Bits in eine 32-Bit-Ganzzahl umgewandelt:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

Der rechte Operand wird in eine unvorzeichenbehaftete 32-Bit-Ganzzahl umgewandelt und dann modulo 32 genommen, sodass der tatsächliche Verschiebungsversatz immer eine positive Ganzzahl zwischen 0 und 31 (einschließlich) ist. Zum Beispiel ist 100 >>> 32 dasselbe wie 100 >>> 0 (und ergibt 100), da 32 modulo 32 gleich 0 ist.

Beispiele

Verwendung von unsigned right shift

js
9 >>> 2; // 2
-9 >>> 2; // 1073741821

Unsigned right shift funktioniert nicht mit BigInts.

js
9n >>> 2n; // TypeError: BigInts have no unsigned right shift, use >> instead

Spezifikationen

Specification
ECMAScript Language Specification
# sec-unsigned-right-shift-operator

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch