無符號右移 (>>>)
無符號右移 (>>>) 運算子返回一個數字,其二進位制表示是第一個運算元向右移動指定位數後的結果。向右移出的多餘位將被丟棄,並且零位將從左側移入。此操作也稱為“零填充右移”,因為符號位變為 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
語法
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 >>> 32 與 100 >>> 0 相同(併產生 100),因為 32 模 32 是 0。
示例
使用無符號右移
9 >>> 2; // 2
-9 >>> 2; // 1073741821
無符號右移不適用於 BigInt。
9n >>> 2n; // TypeError: BigInts have no unsigned right shift, use >> instead
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-unsigned-right-shift-operator |
瀏覽器相容性
載入中…