Javascript位移数字包裹?

时间:2011-07-18 06:00:34

标签: javascript bit-shift

我正在将一些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兆左右)。

问题

我已阅读有关arithmeticlogical bit shifts的维基百科文章,但Javascript似乎并未遵循这些规则。

有人可以向我解释发生了什么吗?

1 个答案:

答案 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,并且您获得的值符合规范。