Java按位运算

Joh*_*ohn 6 java

我有这行代码

int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]);
Run Code Online (Sandbox Code Playgroud)

我有一个小端的bytearray(content []),需要重新创建一个2字节的值.这段代码完成了这项工作,但在测试之前我就是这样编写的

int b1 = 0xffff & (content[12]<<8 | content[11]);
Run Code Online (Sandbox Code Playgroud)

结果不对.我的问题是为什么在这种情况下需要0xff?

Ted*_*opp 12

0xff由于两个因素的汇合,这是必要的:

  1. Java中的所有整数类型都已签名
  2. 所有按位运算符在执行之前都会int(或者long,如果需要)提升它们的参数.

结果是,如果设置了高位content[11],则将其符号扩展为负值int.你需要那么&这个与0xff它返回到(正)字节的值.否则当你|得到结果时content[12]<<8,高位字节将全是1.