右移 (>>)

**右移 (>>)** 运算符返回一个数字或 BigInt,其二进制表示形式是第一个操作数向右移动指定位数的结果。向右移出多余的位将被丢弃,并且从左侧移入左侧最左边位的副本。此操作也称为“符号扩展右移”或“算术右移”,因为结果数字的符号与第一个操作数的符号相同。

试一试

语法

js
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 >> 32100 >> 0 相同(并产生 100),因为 32 模 32 等于 0。

对于 BigInt,没有截断。从概念上讲,将正 BigInt 理解为具有无限多个前导 0 位,将负 BigInt 理解为具有无限多个前导 1 位。

将任何数字 x 右移 0 位将返回转换为 32 位整数的 x。不要使用 >> 0 将数字截断为整数;请改用Math.trunc()

示例

使用右移

js
9 >> 2; // 2
-9 >> 2; // -3

9n >> 2n; // 2n

规范

规范
ECMAScript 语言规范
# sec-signed-right-shift-operator

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅