位操作问题(移位,屏蔽,...)

时间:2017-12-19 17:11:23

标签: java bit-manipulation bitwise-operators bit-shift byte-shifting

为什么这个表达式总是导致-2,147,483,648(11111111 11111111 11111111 11111111)?我不明白。 data []是一个填充了一些值的byte-Array。

(((int)data[29] & 0x00000001) << 31) | (((int)data[30]&0x000000FF)<<12) | (((int)data[31]&0x000000FF)<<4) | (((int)data[32]&0x000000FF)>>>4)

感谢。

1 个答案:

答案 0 :(得分:0)

我不认为你的表达总是会返回signed int的min值。 如果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
相关问题