在 Java 中执行不带符号扩展的按位或

Perform bitwise OR without sign extension in Java

在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 代码中直接使用这些数据,所以应该没关系,对吧?

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

有两种解决方案:

  1. 在转换为 int 之后或执行按位或之后屏蔽高位;例如

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

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

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