Java 十六进制计算

我有这样声明的long值bits:


long bits = len*8L; (304)


System.out.println(bits); 这输出为 304


如果我像这样使用长名称位,我分别得到 0 和 0。


System.out.println(bits>>(4*8));

System.out.println(0xFF&(bits>>(4*8)));

如果我使用实际数字,像这样,我分别得到 304 和 48


System.out.println(304>>(4*8));

System.out.println(0xFF&(304>>(4*8)));

我正在尝试将此 Java 转换为 JavaScript,但 JavaScript 在所有情况下都为我提供 304 和 48。我需要它来匹配 Java 并给出 0 和 0 的值。


编辑

跟进,为了清楚起见,我需要等效于等于 0 的 JavaScript,模仿 Java 当前的操作方式(上面两个等于 0 的示例在我们正在开发的内容中不会改变)。


所以 console.log(0xFF&(bits>>(4*8))) 应该等于 0,它目前等于 48


守候你守候我
浏览 619回答 2
2回答

梵蒂冈之花

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 33console.log(0xFF&(304>>33)); // Shift by 1, not 33

守着星空守着你

如果您想在 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java