在Java中执行按位OR而不带符号扩展

时间:2017-01-29 13:09:16

标签: java unsigned

在Java中,我有以下代码:

    byte lo = 0x88;
    byte hi = 0x0;
    short x = 0;
    x |= lo;
    x |= (short) ((short) hi << 8); // FIXME double cast ??
    return x;

第一次操作后,short中的值为0xff88。我理解这是因为Java不支持无符号数字。

我如何强迫它忽略标志?我没有直接在Java代码中使用这些数据,所以它没关系,对吧?

1 个答案:

答案 0 :(得分:0)

在执行按位运算之前将字节转换为int时,符号出现。转换必须签名扩展byte值,因为byte是Java中的签名类型。必须进行转换,因为按位操作是对int值或long值的操作。

有两种解决方案:

  1. 在转换为int之后或执行按位OR之后屏蔽顶部位; e.g。

    x |= (lo & 0xff);
    x |= (hi & 0xff) << 8;
    

    (事实证明,hi ...不需要屏蔽......因为你以后会做什么。但是,JIT编译器很可能会优化掉任何不必要的屏蔽指令。如果它没有' t,开销很小,不太重要。)

  2. 使用Byte.toUnsignedInt(byte)byte转换为int