无符号右移 (>>>)
**无符号右移 (>>>
)** 运算符返回一个数字,其二进制表示形式是第一个操作数向右移动指定位数的结果。向右移出的多余位将被丢弃,并且从左侧移入零位。此操作也称为“零填充右移”,因为符号位变为 0
,因此结果数字始终为正。无符号右移不接受 BigInt 值。
试一试
语法
x >>> y
描述
与其他算术和按位运算符不同,无符号右移运算符不接受 BigInt 值。这是因为它用零填充最左侧的位,但从概念上讲,BigInt 有无限数量的前导符号位,因此没有“最左侧的位”可以填充零。
该运算符对左侧操作数的二进制表示形式进行 补码 操作。考虑十进制 (以 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(含)之间的正整数。例如,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 语言规范 # sec-unsigned-right-shift-operator |
浏览器兼容性
BCD 表仅在浏览器中加载