gpt4 book ai didi

Javascript 位移位-数字换行?

转载 作者:行者123 更新时间:2023-11-29 22:31:24 24 4
gpt4 key购买 nike

我正在将一些 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 位移: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 似乎并没有遵守规则。

谁能给我解释一下这是怎么回事?

最佳答案

来自 http://ecma262-5.com/ELS5_HTML.htm

11.7.3 The Unsigned Right Shift Operator ( >>> )

Performs a zero-filling bitwise right shift operation on the left operand by the amount specified by the right operand.

The production ShiftExpression : ShiftExpression >>> AdditiveExpression is evaluated as follows:

1 Let lref be the result of evaluating ShiftExpression.

2 Let lval be GetValue(lref).

3 Let rref be the result of evaluating AdditiveExpression.

4 Let rval be GetValue(rref).

5 Let lnum be ToUint32(lval).

6 Let rnum be ToUint32(rval).

7 Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.

8 Return the result of performing a zero-filling right shift of lnum by shiftCount bits. Vacated bits are filled with zero. The result is an unsigned 32-bit integer.

请注意第 7 步,移位计数被 chop 为 5 位,因此 32 变为 0,40 变为 8,您获得的值符合规范。

关于Javascript 位移位-数字换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6729122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com