- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将一些 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/
在 Vaadin 7.0,显示时JavaBean Table 中的数据与 BeanContainer ,用新数据刷新表的正确方法是什么? 最佳答案 该表通过监听器监视表项的属性。如果您通过表的 Ite
首先,我使用的是带有 Axis2 1.6.2 的 eclipse,我正在 tomcat 6 上部署我创建的 Web 服务。Web 服务是在 eclipse 中通过自上而下的方法创建的。 我被要求使对我
我已将 Rails 3.1.1 应用程序升级到 Rails 3.1.3,现在,对于每个请求,它仅响应错误数量的参数(3 for 1)。不幸的是,它没有说明错误在哪里,并且应用程序跟踪为空。我认为存在一
我是一名优秀的程序员,十分优秀!