按位或做的比预期的多
Bitwise OR doing more than expected
我正在编写一个需要使用按位或运算的简单模块。我的计划是"Bitwise ORing"四个数字:
- 0x00000004
- 0x00000010
- 0x00000040
- 0x80000000
我将它们输出到控制台,以二进制而不是十六进制显示它们:
0x00000004.toString(2)
"100"
0x00000010.toString(2)
"10000"
0x00000040.toString(2)
"1000000"
0x80000000.toString(2)
"10000000000000000000000000000000"
到目前为止一切顺利。如果我对所有这些一起使用按位或运算符,我会收到一个非常奇怪的结果:
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)或者这是一个错误?还是我误解了按位或的用法?
在JavaScript、|
and other bit operations except >>>
execute ToInt32
之前操作。因此,0x80000000
被转换为 -2147483648。您可以通过 0x80000000 | 0
.
来验证这一点
如果您希望结果表示为正数。您可以 >>> 0
调用 ToUint32
.
(0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0 // 2147483732
((0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0).toString(2) // '10000000000000000000000001010100'
我正在编写一个需要使用按位或运算的简单模块。我的计划是"Bitwise ORing"四个数字:
- 0x00000004
- 0x00000010
- 0x00000040
- 0x80000000
我将它们输出到控制台,以二进制而不是十六进制显示它们:
0x00000004.toString(2)
"100"
0x00000010.toString(2)
"10000"
0x00000040.toString(2)
"1000000"
0x80000000.toString(2)
"10000000000000000000000000000000"
到目前为止一切顺利。如果我对所有这些一起使用按位或运算符,我会收到一个非常奇怪的结果:
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)或者这是一个错误?还是我误解了按位或的用法?
在JavaScript、|
and other bit operations except >>>
execute ToInt32
之前操作。因此,0x80000000
被转换为 -2147483648。您可以通过 0x80000000 | 0
.
如果您希望结果表示为正数。您可以 >>> 0
调用 ToUint32
.
(0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0 // 2147483732
((0x00000004 | 0x00000010 | 0x00000040 | 0x80000000) >>> 0).toString(2) // '10000000000000000000000001010100'