2013-04-04 123 views
6

我有这行代码爪哇位运算

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

我在小端排序的ByteArray(内容[])和需要重新创建一个2字节值。此代码工作得很好,但在测试之前我曾经有过这样写

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

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

+0

因为字节被解释为带符号整数,这意味着,例如,(字节)0x80得到(int)0xffffff80。这称为符号扩展。 – Ingo 2013-04-04 18:26:33

回答

12

0xff是必要的,因为两个因素的汇合:

  1. Java中的所有整数类型采取行动之前签署
  2. 所有位运算符宣传自己的论点int(或long,如果需要的话)。

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

+0

Thx回复!我不会猜测内容[11]会被转换为高位设置的int。我认为当我将两个值与OR结合时,他们会在比特级别上使用。干杯 – John 2013-04-04 18:34:03

+1

@John如果你对这个答案感到满意(你似乎是这样),请[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作)。 – 2013-04-05 16:30:55