我有这行代码
int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]);
我有一个小字节序的 bytearray (content[]),需要重新创建一个 2 字节的值。这段代码很好地完成了工作,但在测试之前我是这样写的
int b1 = 0xffff & (content[12]<<8 | content[11]);
结果不对。我的问题是为什么在这种情况下需要 0xff?
最佳答案
0xff
是必要的,因为有两个因素:
- Java 中的所有整数类型都是有符号的
- 所有按位运算符都将其参数提升为
int
(或long
,如有必要)在行动之前。
结果是如果content[11]
的高位被设置,它将被符号扩展为负数 int
值(value)。然后你需要 &
这与 0xff
将其返回到(正)字节值。否则当你|
结果为 content[12]<<8
, 高位字节全为1。
关于Java 按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15818800/