Java位运算

6
我有这一行代码。
int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]);

我有一个小端字节序的bytearray(content []),需要重新创建一个2字节值。这段代码完美地完成了这项工作,但在测试之前,我将其编写为:

int b1 = 0xffff & (content[12]<<8 | content[11]);

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


因为字节被解释为有符号整数,这意味着例如(byte) 0x80得到(int) 0xffffff80。这被称为符号扩展。 - Ingo
1个回答

12

0xff是必需的,因为有两个因素交织在一起:

  1. Java中所有整数类型都是有符号的
  2. 所有位运算符在执行操作之前将其参数提升为int(如果必要则为long)。

结果是,如果content[11]的高位设置了,它将被扩展为负的int值。然后需要使用&运算符与0xff进行与运算,以将其返回为(正)字节值。否则,当您将其与content[12]<<8的结果进行|运算时,高位字节将全部为1。


谢谢回复!我没想到content[11]会被强制转换为带高位比特的整数。我原以为当我用OR组合两个值时,它们会在位级别上按原样使用。干杯! - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接