2 回答
TA贡献1900条经验 获得超5个赞
JLS 第 15.19 节介绍了 Java 中的移位运算符。
如果左侧操作数的提升类型是int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数经过按位逻辑 AND 运算符 & (§15.22.1) 和掩码值0x1f( 0b11111)。因此,实际使用的移位距离总是在 到 的范围内0,31包括 。
对于int诸如的值, 或 32304的位移值4*8实际上是0,因此不会发生位移。然后有点-and with 0xFFyield 48。
如果左侧操作数的提升类型是long,则仅将右侧操作数的最低六位用作移位距离。就好像右手操作数经过按位逻辑 AND 运算符 & (§15.22.1) 和掩码值0x3f( 0b111111)。因此,实际使用的移位距离总是在 到 的范围内0,63包括 。
对于一个long值, 的位移位值4*8确实向右移动了 32 位,从而产生0.
本页介绍 JavaScript 位移运算符。
按位运算符将其操作数视为 32 位(零和一)的序列,而不是十进制、十六进制或八进制数。
似乎 JavaScript 将数字转换为 32 位数字,如 Java int。同样的“只有最少 5 位”规则似乎也适用于 JavaScript 中的移位操作数。
console.log(304>>32); // Don't shift!
console.log(0xFF&(304>>32)); // Don't shift!
console.log(304>>33); // Shift by 1, not 33
console.log(0xFF&(304>>33)); // Shift by 1, not 33
TA贡献1799条经验 获得超8个赞
如果您想在 Java 中使用常量和变量获得相同的结果,则需要将 304 作为 long 常量与 一起传递304L,如下所示:
System.out.println(304L>>(4*8));
System.out.println(0xFF&(304L>>(4*8)));
原因是你不能int用 4*8=32 位移动一个;Java 将移动 32 模 32 = 零但是,因为 anint只有 32 位长。
相比之下,Javascript 不支持使用>>运算符移动 64 位整数;它将您传递给的每个数字都>>视为 32 位整数。
您可以编写自己的函数来执行类似的操作:
function rshift(num, bits) {
return Math.round(num / Math.pow(2,bits));
}
console.log(rshift(304, 4*8))
添加回答
举报
