了解 Java 包含或运算符 ( | )



>我正在尝试解决这个问题:我有一个字节值(1 个字节(,我需要将此值转换为值(8 个字节(。但我想要的只是用我之前的字节值替换长变量的第一个字节。

举个例子:

My Byte Value: 11001101
My Long Value: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
What I want: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11001101

就这么简单!

我正在尝试这样做(示例(:

byte b = -112;
long l = 0;
l = l | b;
System.out.println(l);

但我得到的结果是-112!在我的理解中,java位或运算符应该对长整型值的第一个字节和字节值做一个"or"。相反,or 运算符将字节值的 2 补码表示复制到长整型值中,这不是我想要的。

在这种情况下,我期望的结果是 144

,因为 -112 是 10010000,在考虑无符号值时是 144。

希望你能理解我。谢谢!

这里发生的事情是b被强制转换为long,这是通过符号扩展完成的:最高有效位(1(被重复,因此7 11111111字节被用作填充。这里的补救措施是显式考虑结果值中的 8 个最低有效位,使用按位和 ( & (:

l = l | ((long)b & 0xff);
Java 在

执行数学运算之前将已签名的byte提升为已签名的long,并且该符号扩展了字节。

要修复它,您可以执行以下操作:

l = l | (0xFF & (long)b))

l |= 0xFF & (long)b

(这有效0xFF因为 int 值为正。如果它是一个byte,它也会得到符号扩展到负长。(在此处将 b 转换为int以及转换为long一样有效。

最新更新