無符號右移 (>>>)

Baseline 已廣泛支援

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

無符號右移 (>>>) 運算子返回一個數字,其二進位制表示是第一個運算元向右移動指定位數後的結果。向右移出的多餘位將被丟棄,並且零位將從左側移入。此操作也稱為“零填充右移”,因為符號位變為 0,因此結果始終為正數。無符號右移不接受 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); //  00111111111111111111111111111110
// Expected output: 1073741822

語法

js
x >>> y

描述

與其他算術和位運算子不同,無符號右移運算子不接受 BigInt 值。這是因為它用零填充最左邊的位,但從概念上講,BigInts 有無限數量的前導符號位,因此沒有“最左邊的位”可以用零填充。

該運算子根據左運算元在二進位制補碼中的位表示進行操作。考慮十進位制(基數 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,零填充右移和符號傳播右移產生相同的結果:9 >>> 2 產生 2,與 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)

請注意,最右邊的兩位 01 已被移出,兩個零已從左側移入。

但是,請注意 -9 發生了什麼:-9 >> 2符號傳播右移)產生 -3,但 -9 >>> 2(零填充右移)產生 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)

請注意,最右邊的兩位 11 已被移出。對於 -9 >> 2符號傳播右移),最左邊的 1 位的兩個副本已從左側移入,這保留了負號。另一方面,對於 -9 >>> 2(零填充右移),零已從左側移入,因此數字的負號沒有保留,結果是一個(大)正數。

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

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

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

示例

使用無符號右移

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

無符號右移不適用於 BigInt。

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

規範

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

瀏覽器相容性

另見