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

时间:2014-10-22 22:31:55

标签: java byte long-integer

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

一个例子:

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位或运算符应该使用long值的第一个字节和字节值来执行“或”。相反,or运算符正在将字节值的2补码表示复制到long值中,这不是我想要的。

我在这种情况下期待的结果是144,因为-112是10010000,考虑无符号值时为144.

希望你了解我。谢谢!

2 个答案:

答案 0 :(得分:3)

这里发生的事情是b被投射到long,这是通过符号扩展完成的:重复最重要的位(1),因此7 11111111个字节用作填充。这里的补救措施是使用按位和(&)明确地仅考虑结果值中的8个最低有效位:

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

答案 1 :(得分:2)

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

要解决此问题,您可以执行以下操作:

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

l |= 0xFF & (long)b

(这是有效的,因为0xFF是一个正int值。如果它是byte,它也会将符号扩展为负长。)(施法b到这里的int可以和long一样投射。)