无符号右移 (>>>)

**无符号右移 (>>>)** 运算符返回一个数字,其二进制表示形式是第一个操作数向右移动指定位数的结果。向右移出的多余位将被丢弃,并且从左侧移入零位。此操作也称为“零填充右移”,因为符号位变为 0,因此结果数字始终为正。无符号右移不接受 BigInt 值。

试一试

语法

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

示例

使用无符号右移

js
9 >>> 2; // 2
-9 >>> 2; // 1073741821

无符号右移不适用于 BigInt。

js
9n >>> 2n; // TypeError: BigInts have no unsigned right shift, use >> instead

规范

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

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅