我正在实现 BER 压缩整数的解码,最近我发现了一个与大整数的按位运算相关的奇怪的 JavaScript 行为。
例如:
var a = 17516032; // has 25 bits
alert(a << 7) // outputs -2052915200
alert(a * 128) // outputs 2242052096
alert(2242052096 >> 16) // outputs -31325
alert(2242052096 / 65536) // outputs 34211
虽然第一个解决方法(乘法而不是左移)是可以接受的,但第二个不是。
为什么会这样?如何承受?
最佳答案
17516032
在二进制中是 00000001000010110100011000000000
。向左移动 7 得到 10000101101000110000000000000000
。这等于 two's complement 中的 -2052915200
(这几乎是所有计算机表示负数的方式)。
>>>
是一个带符号的右移。这意味着最左边的位(决定数字的符号)将移到左侧。
例如
1100 >> 2 == 1111
0111 >> 2 == 0001
如果你想做一个无符号移位(忽略符号位),使用 >>>
它将零填充位串的左端。
关于javascript - 大整数的位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847636/