在 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
值的运算。
有两种解决方案:
在转换为 int
之后或执行按位或之后屏蔽高位;例如
x |= (lo & 0xff);
x |= (hi & 0xff) << 8;
(事实证明,对于 hi
来说,屏蔽是不必要的......因为你稍后会做些什么。但是,JIT 编译器可能会优化掉任何不必要的屏蔽指令。如果它没有,开销很小,不太可能重要。)
使用Byte.toUnsignedInt(byte)
将byte
转换为int
。
在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
值的运算。
有两种解决方案:
在转换为
int
之后或执行按位或之后屏蔽高位;例如x |= (lo & 0xff); x |= (hi & 0xff) << 8;
(事实证明,对于
hi
来说,屏蔽是不必要的......因为你稍后会做些什么。但是,JIT 编译器可能会优化掉任何不必要的屏蔽指令。如果它没有,开销很小,不太可能重要。)使用
Byte.toUnsignedInt(byte)
将byte
转换为int
。