>我正在尝试解决这个问题:我有一个字节值(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);
执行数学运算之前将已签名的byte
提升为已签名的long
,并且该符号扩展了字节。
要修复它,您可以执行以下操作:
l = l | (0xFF & (long)b))
或
l |= 0xFF & (long)b
(这有效0xFF
因为 int
值为正。如果它是一个byte
,它也会得到符号扩展到负长。(在此处将 b 转换为int
以及转换为long
一样有效。