右移 (>>)

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

右移 (>>) 運算子返回一個數字或 BigInt,其二進位制表示是第一個運算元向右移動指定位數的結果。超出右側的位被丟棄,並且最左側的位副本從左側移入。此操作也稱為“符號傳播右移”或“算術右移”,因為結果數字的符號與第一個運算元的符號相同。

試一試

const a = 5; //  00000000000000000000000000000101
const b = 2; //  00000000000000000000000000000010
const c = -5; //  11111111111111111111111111111011

console.log(a >> b); //  00000000000000000000000000000001
// Expected output: 1

console.log(c >> b); //  11111111111111111111111111111110
// Expected output: -2

語法

js
x >> y

描述

>> 運算子針對兩種型別的運算元進行了過載:數字和 BigInt。對於數字,該運算子返回一個 32 位整數。對於 BigInt,該運算子返回一個 BigInt。它首先 將兩個運算元強制轉換為數值,然後測試它們的型別。如果兩個運算元都變為 BigInt,則執行 BigInt 右移;否則,它將兩個運算元轉換為 32 位整數並執行數字右移。如果一個運算元變為 BigInt 而另一個變為數字,則會丟擲 TypeError

由於新的最左位與之前的最左位值相同,因此符號位(最左位)不會改變。因此得名“符號傳播”。

該運算子作用於左運算元的 補碼 二進位制表示。考慮十進位制(基數 10)數字 9-9 的 32 位二進位制表示:

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

負十進位制(基數 10)數字 -9 的補碼二進位制表示是透過反轉其相反數(即 9,二進位制為 00000000000000000000000000001001)的所有位,然後加 1 形成的。

在兩種情況下,二進位制數的符號都由其最左位給出:對於正十進位制數 9,二進位制表示的最左位是 0;對於負十進位制數 -9,二進位制表示的最左位是 1

給定十進位制(基數 10)數字 9-9 的這些二進位制表示:

9 >> 2 得到 2

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

請注意,兩個最右邊的位 01 已被移出,並且兩個最左邊的位 0 的副本已從左側移入。

-9 >> 2 得到 -3

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

請注意,兩個最右邊的位 11 已被移出。但就最左邊的位而言:在這種情況下,最左邊的位是 1。因此,兩個最左邊的 1 位的副本已從左側移入——這保留了負號。

二進位制表示 11111111111111111111111111111101 等於負十進位制(基數 10)數字 -3,因為所有負整數都儲存為 補碼,並且可以透過反轉正十進位制(基數 10)數字 3 的二進位制表示(即 00000000000000000000000000000011)的所有位,然後加一來計算。

如果左運算元是超過 32 位的數字,則其最高有效位將被丟棄。例如,以下超過 32 位的整數將轉換為 32 位整數:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

右運算元將轉換為無符號 32 位整數,然後取模 32,因此實際的移位偏移量將始終是一個介於 0 到 31 之間(包括 0 和 31)的正整數。例如,100 >> 32100 >> 0 相同(併產生 100),因為 32 模 32 是 0。

警告:您可能會看到有人使用 >> 0 將數字截斷為整數。將任何數字 x 右移 0 會返回 x 轉換為 32 位整數的結果,這還會移除超出 -2147483648 到 2147483647 範圍的數字的前導位。請改用 Math.trunc()

對於 BigInt,沒有截斷。從概念上講,將正 BigInt 理解為具有無限數量的前導 0 位,將負 BigInt 理解為具有無限數量的前導 1 位。

示例

使用右移

js
9 >> 2; // 2
-9 >> 2; // -3

9n >> 2n; // 2n

規範

規範
ECMAScript® 2026 語言規範
# sec-signed-right-shift-operator

瀏覽器相容性

另見