我正在将一些Java代码转换为Javascript以在node.js上运行,我遇到了一些特殊的位移。
原始的Java使用了长而逻辑的位移,因此我在Javascript中复制了这个(我通过算术移位得到了相同的结果):
var num = 3382;
num >>> 0 & 0xFF; // 54, as expected
num >>> 8 & 0xFF; // 13, as expected
num >>> 16 & 0xFF; // 0, as expected
num >>> 24 & 0xFF; // 0, as expected
num >>> 32 & 0xFF; // 54??
num >>> 40 & 0xFF; // 13??
我在节点,FF 4和Chrome 12上得到相同的结果。
似乎Javascript在用完比特时将整数位包装起来。 Javascript,AFAIK,在后台允许最多32位数字,但这应该不是问题。
这就是我的想法:
0-shift:00000000000000000000110100110110
8班:00110110000000000000000000001101
16班:00001101001101100000000000000000
24班:00000000000011010011011000000000
32班:00000000000000000000110100110110
我在C中写了一个小测试,以确保我不会疯狂(注意,有编译警告,但这是预期的):
#include <stdio.h>
int main() {
printf("Bit shift tests:\n");
printf("3382 >> 0 & 0xFF: %d\n", 3382 >> 0 & 0xFF);
printf("3382 >> 8 & 0xFF: %d\n", 3382 >> 8 & 0xFF);
printf("3382 >> 16 & 0xFF: %d\n", 3382 >> 16 & 0xFF);
printf("3382 >> 24 & 0xFF: %d\n", 3382 >> 24 & 0xFF);
printf("3382 >> 32 & 0xFF: %d\n", 3382 >> 32 & 0xFF);
printf("3382 >> 48 & 0xFF: %d\n", 3382 >> 48 & 0xFF);
printf("3382 >> 56 & 0xFF: %d\n", 3382 >> 56 & 0xFF);
printf("3382 >> 64 & 0xFF: %d\n", 3382 >> 64 & 0xFF);
}
我只关心32位数字。 Java代码使用64位数字,但数字代表文件大小,我不会使用大文件(大约50兆左右)。
我已阅读有关arithmetic和logical bit shifts的维基百科文章,但Javascript似乎并未遵循这些规则。
有人可以向我解释发生了什么吗?
答案 0 :(得分:2)
来自http://ecma262-5.com/ELS5_HTML.htm
11.7.3无符号右移运算符(&gt;&gt;&gt;)
在左侧执行零填充按位右移操作 操作数由右操作数指定的数量。
生产ShiftExpression:ShiftExpression&gt;&gt;&gt; AdditiveExpression的计算方法如下:
1让lref成为评估ShiftExpression的结果。
2让lval为GetValue(lref)。
3让rref成为评估AdditiveExpression的结果。
4让rval为GetValue(rref)。
5让lnum为ToUint32(lval)。
6让rnum成为ToUint32(rval)。
7让shiftCount成为掩盖所有但最不重要的结果 显着的5位rnum,即计算rnum&amp;为0x1F。
8返回执行lnum的零填充右移的结果 通过shiftCount位。空位用零填充。结果是 无符号的32位整数。
注意步骤7,移位计数被截断为5位,因此32变为0,40变为8,并且您获得的值符合规范。