按位或比预期更多

时间:2015-03-18 08:36:45

标签: javascript bitwise-operators bitwise-or

我正在编写一个需要使用Bitwise OR的简单模块。我的计划是“按位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"

我不知道有限制吗? (我实际上做了查找reference on MDN)或者这是一个错误吗?或者我是否误解了Bitwise OR的使用?

1 个答案:

答案 0 :(得分:4)

在JavaScript中,|和除>>>之外的其他位操作在执行之前执行ToInt32。因此,0x80000000已转换为-2147483648。您可以0x80000000 | 0验证这一点。

如果您希望结果表示为正数。您可>>> 0致电ToUint32

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