我有一个长度为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)错了?
答案 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时,请确保结果为正。