JavaScript中的符号位右移和零填充右移有什么区别?

9
据我所知, 符号扩展右移(a >> b):将二进制表示中的a向右移动b位,舍弃移出的位。
例如:8>>2将返回2。因为二进制1000会向右移动2次,返回0010。 零填充右移(a >>> b):将二进制表示中的a向右移动b位,舍弃移出的位,并从左侧填充零。
例如:8>>2返回2。它也返回相同的值。
那么>>>>>运算符有什么区别?为什么JavaScript有这两个运算符而不是一个?如果我理解错误,请指导我正确的概念。

1
尝试运行-8 >> 2:结果为-2,而-8 >>> 2的结果为1073741822。 - Rick Hitchcock
1
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift 可以给您正确的答案。 - ale
1个回答

12

按位运算符假定它们的操作数是32位有符号整数。

在二进制中,00000000000000000000000000001000等于十进制中的8

8 >> 2中,带符号右移位运算符(>>)将二进制数向右移动两个位置,保留符号(即第一个位):

在二进制中,00000000000000000000000000000010等于十进制中的2

8 >>> 2中,零填充右移运算符(>>>)将二进制数向右移动两个位置,并用0填充左边的位:

在二进制中,00000000000000000000000000000010等于十进制中的2

这些是相同的,因为正二进制数的第一个位是0。

来自于MDN:

对于非负数,零填充右移和符号传播右移产生相同的结果。

然而,对于负数,情况则不同:

在二进制中,11111111111111111111111111111000等于十进制中的-8

-8 >> 2中,带符号右移位运算符(>>)将二进制数向右移动两个位置,保留符号:

在二进制中,11111111111111111111111111111110等于十进制中的-2

-8 >>> 2中,零填充右移运算符(>>>)将二进制数向右移动两个位置,并用0填充左边的位:

00111111111111111111111111111110在二进制下等于1073741822在十进制下。


你能举一个每个运算符在负数中使用的例子吗?为什么会使用 >> 而不是 >>>,反之亦然? - Adelin
1
有人能解释一下为什么会发生这种情况吗?Number.MAX_SAFE_INTEGER9007199254740991,而Number.MAX_SAFE_INTEGER.toString(2)"11111111111111111111111111111111111111111111111111111",所以Number.MAX_SAFE_INTEGER >> 1的结果是-1 - robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接