我正在实现 BER 压缩整数的解码,最近我发现了与大整数按位运算相关的奇怪 JavaScript 行为。
E.g.:
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
。这等于-2052915200
in 二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement(这几乎是所有计算机表示负数的方式)。
>>
是有符号右移。这意味着最左边的位(决定数字的符号)将移到左侧。
e.g.
1100 >> 2 == 1111
0111 >> 2 == 0001
如果您想进行无符号移位(忽略符号位),请使用>>>
这将对位串的左端进行零填充。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)