Bitwise或比预期做得更多

Bitwise OR doing more than expected

本文关键字:Bitwise      更新时间:2023-09-26

我正在编程一个简单的模块,它需要使用位或。我的计划是"Bitwise ORing"四个数字:

  • 0x00000004
  • 0x00000010
  • 0x00000040
  • 0x80000000

我在控制台上输出它们,以二进制而不是十六进制显示它们:

0x00000004.toString(2)
"100"
0x00000010.toString(2)
"10000"
0x00000040.toString(2)
"1000000"
0x80000000.toString(2)
"10000000000000000000000000000000"

到目前为止还不错。如果我在所有这些上同时使用Bitwise OR运算符,我会得到一个非常奇怪的结果:

0x00000004 | 0x00000010 | 0x00000040 | 0x80000000
-2147483564

分别为二进制:

(0x00000004 | 0x00000010 | 0x00000040 | 0x80000000).toString(2)
"-1111111111111111111111110101100"

这在我看来显然是错误的,因为我实际上预料到了这一点:

  00000000000000000000000000000100
| 00000000000000000000000000010000
| 00000000000000000000000001000000
| 10000000000000000000000000000000
= 10000000000000000000000001010100

分别以十进制表示:

parseInt('10000000000000000000000001010100', 2)
2147483732

或十六进制:

(2147483732).toString(16)
"80000054"

有没有我不知道的限制?(实际上,我确实在MDN上查找了引用)或者这是一个bug?或者我误解了Bitwise Or的用法?

在JavaScript中,|和除>>>之外的其他位操作在操作之前执行ToInt32。因此,0x80000000被转换为-2147483648。您可以通过0x80000000 | 0对此进行验证。

如果希望将结果表示为正数。您可以调用ToUint32>>> 0

(0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0 // 2147483732
((0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0).toString(2) // '10000000000000000000000001010100'