我正在编写一个需要使用Bitwise OR的简单模块。我的计划是“按位ORing”四个数字:
我在控制台上输出了它们,用二进制代替十六进制来显示它们:
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的使用?
答案 0 :(得分:4)
在JavaScript中,|
和除>>>
之外的其他位操作在执行之前执行ToInt32
。因此,0x80000000
已转换为-2147483648。您可以0x80000000 | 0
验证这一点。
如果您希望结果表示为正数。您可>>> 0
致电ToUint32
。
(0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0 // 2147483732
((0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0).toString(2) // '10000000000000000000000001010100'