将长度为3的字节数组转换为int

时间:2018-01-21 15:21:23

标签: java bit-manipulation

我有一个长度为3的字节数组,表示 decimal 二进制数。我的问题:

为什么这是正确的:

(a)int x = (array[0] & 0xff) << 16 | (array[1] & 0xff) << 8 | (array[2] & 0xff);

但这不是<?p?

(b)int x = array[0] << 16 | array[1] << 8 | array[2];

让我们说数组[0]是01010101。这不是发生了什么事吗?

array[0] & 0xff = 01010101 & 11111111 = 01010101 = array[0]

为什么选项b)错了?

1 个答案:

答案 0 :(得分:3)

考虑当array[0]的最高位为1时会发生什么。

例如:

array[0] = (byte)0xff;
System.out.println (array[0] << 16);
System.out.println ((array[0] & 0xff) << 16);

输出:

-65536
16711680
为了左移运算符,

array[0]被转换为int。如果它的值为byte,则其值为int,并且在左移后将为负值。

当您使用0xff执行逐位AND时,请确保结果为正。