按位或不产生预期结果

时间:2014-03-06 03:42:58

标签: java numbers int byte bit-manipulation

我有以下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。

3 个答案:

答案 0 :(得分:2)

如果你用8位字节移动所有内容,你就完全关闭了所有内容。使用完全归零的输出字节进行“或”与添加零或乘以1 ...

相同

答案 1 :(得分:1)

请记住abyte。因此,当你执行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。