为了账号安全,请及时绑定邮箱和手机立即绑定

Java 十六进制计算

Java 十六进制计算

守候你守候我 2022-01-19 17:16:02
我有这样声明的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 和 48System.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
查看完整描述

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


查看完整回答
反对 回复 2022-01-19
?
守着星空守着你

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))


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 617 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号