右移 (>>)
右移 (>>) 運算子返回一個數字或 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
語法
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 >> 32 與 100 >> 0 相同(併產生 100),因為 32 模 32 是 0。
警告:您可能會看到有人使用 >> 0 將數字截斷為整數。將任何數字 x 右移 0 會返回 x 轉換為 32 位整數的結果,這還會移除超出 -2147483648 到 2147483647 範圍的數字的前導位。請改用 Math.trunc()。
對於 BigInt,沒有截斷。從概念上講,將正 BigInt 理解為具有無限數量的前導 0 位,將負 BigInt 理解為具有無限數量的前導 1 位。
示例
使用右移
9 >> 2; // 2
-9 >> 2; // -3
9n >> 2n; // 2n
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-signed-right-shift-operator |
瀏覽器相容性
載入中…