我正在实现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.这等于-20000年的-2052915200(几乎所有的电脑几乎代表负数).
>>是一个签名右转.这意味着最左边的位(确定一个数字的符号)将被移入左边.
例如
1100 >> 2 == 1111 0111 >> 2 == 0001
如果要执行无符号移位(忽略符号位),请使用>>>这将填补bitstring的左端.