我正在尝试解决这个问题:我有一个字节值(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.
希望你了解我。谢谢!答案 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
一样投射。)