无符号右移 (>>>)
无符号右移 (>>>) 运算符返回一个数字,其二进制表示是第一个操作数向右移动指定位数后的结果。向右移出的多余位将被丢弃,并且零位将从左侧移入。此操作也称为“零填充右移”,因为符号位变为 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 |
浏览器兼容性
加载中…