我有以下java代码:
public static void main(String []args){
int a = 1;
byte b = -14;
int c = (a << 8) | b;
System.out.println(c);
}
产生:
-14
我原本预期498.据我所知,OR操作在移位后将如下所示:1 0000 0000 | 1111 0010,我希望这会导致一个看起来像0000 0001 1111 0010的int,值为498.显然,当它将OR转换为int c时,Java会以某种方式标记扩展字节。有谁能告诉我这样做的正确方法?
我要做的是创建一个int,其中最低有效字节为b,第二个最低有效字节为a。
答案 0 :(得分:2)
如果你用8位字节移动所有内容,你就完全关闭了所有内容。使用完全归零的输出字节进行“或”与添加零或乘以1 ...
相同答案 1 :(得分:1)
请记住a
是byte
。因此,当你执行a << 8
时,它不会向右移动8个位置,有效地使其为0.它将结果提升为int。我建议将a
定义为int
。
更新:
int c =((a <&lt; 8)|〜(~0 <&lt; 8)&amp; b);将导致498的预期答案
答案 2 :(得分:0)
对于java中的按位运算符,你不能轻易地做到这一点。解决方案是使用ByteBuffer。
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.put((byte)0);
byteBuffer.put((byte)0);
byteBuffer.put((byte)1);
byteBuffer.put((byte)-14);
byteBuffer.rewind();
int bodyLength = byteBuffer.getInt();
System.out.println(bodyLength);
上面的代码将打印498。