右移 (>>)
**右移 (>>
)** 运算符返回一个数字或 BigInt,其二进制表示形式是第一个操作数向右移动指定位数的结果。向右移出多余的位将被丢弃,并且从左侧移入左侧最左边位的副本。此操作也称为“符号扩展右移”或“算术右移”,因为结果数字的符号与第一个操作数的符号相同。
试一试
语法
x >> y
描述
>>
运算符对两种类型的操作数进行了重载:数字和BigInt。对于数字,运算符返回一个 32 位整数。对于 BigInt,运算符返回一个 BigInt。它首先将两个操作数强制转换为数字值并测试它们的类型。如果两个操作数都变为 BigInt,则执行 BigInt 右移;否则,将两个操作数转换为32 位整数并执行数字右移。TypeError
如果一个操作数变为 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 >> 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(含)之间的正整数。例如,100 >> 32
与 100 >> 0
相同(并产生 100
),因为 32 模 32 等于 0。
对于 BigInt,没有截断。从概念上讲,将正 BigInt 理解为具有无限多个前导 0
位,将负 BigInt 理解为具有无限多个前导 1
位。
将任何数字 x
右移 0
位将返回转换为 32 位整数的 x
。不要使用 >> 0
将数字截断为整数;请改用Math.trunc()
。
示例
使用右移
9 >> 2; // 2
-9 >> 2; // -3
9n >> 2n; // 2n
规范
规范 |
---|
ECMAScript 语言规范 # sec-signed-right-shift-operator |
浏览器兼容性
BCD 表仅在浏览器中加载