为什么这个表达式总是导致 -2,147,483,648 (11111111 11111111 11111111 11111111)?我不明白。data[] 是一个填充了一些值的字节数组。
(((int)data[29] & 0x00000001) << 31) | (((int)data[30]&0x000000FF)<<12) | (((int)data[31]&0x000000FF)<<4) | (((int)data[32]&0x000000FF)>>>4)
谢谢。
为什么这个表达式总是导致 -2,147,483,648 (11111111 11111111 11111111 11111111)?我不明白。data[] 是一个填充了一些值的字节数组。
(((int)data[29] & 0x00000001) << 31) | (((int)data[30]&0x000000FF)<<12) | (((int)data[31]&0x000000FF)<<4) | (((int)data[32]&0x000000FF)>>>4)
谢谢。
我认为您的表达式并不总是返回带符号整数的最小值。如果data
数组中的所有值都为零,则它将返回零。
我也不认为这会导致将所有位设置为 1。
我使用以下代码(Java)Integer.MAX_VALUE
:
int max = Integer.MAX_VALUE; //(2^31 - 1) - all bits apart from the sign are 1
System.out.print(Integer.toBinaryString(((max & 0x00000001) << 31) | ((max&0x000000FF)<<12) | ((max&0x000000FF)<<4) | ((max&0x000000FF)>>>4)));
返回:
10000000000011111111111111111111
System.out.print(Integer.toBinaryString(
((0b00101001 & 0x00000001) << 31) |
((0b11111111 & 0x000000FF) << 12) |
((0b11111001 & 0x000000FF) << 4) |
((0b11001111 & 0x000000FF ) >>> 4))
);
返回:
10000000000011111111111110011100