Java 字节移位逆运算

Java 字节移位逆运算,java,byte,bit-manipulation,bitwise-operators,Java,Byte,Bit Manipulation,Bitwise Operators,我有这个密码 byte[] b = new byte[]{-33,-4,20,30}; System.err.println(Arrays.toString(b)); int x = (b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]; b = new byte[]{(byte)(x >> 24), (byte)(x >> 16), (byte)(x >> 8), (byt

我有这个密码

byte[] b = new byte[]{-33,-4,20,30};
System.err.println(Arrays.toString(b));

int x =  (b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3];

b = new byte[]{(byte)(x >> 24), (byte)(x >> 16), (byte)(x >> 8), (byte)(x)};

System.err.println(Arrays.toString(b));

我不明白为什么这个操作不是反向的。

您的问题是不需要的符号扩展

具体地说,
b[1]
-4
,或者
0xfc
,它被符号扩展到
0xfffffc
,然后左移到
0xfffc0000
。这具有将最高有效字节递减1的效果

尝试:


intx=((b[0]&0xff)请忽略我之前的答案;它完全错了

我认为这里的问题是,当你以这种方式组合比特时:

(b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]
这里,前导1来自整数的有符号二补表示,这使得负数由许多前导零表示

11111111 bbbbbbbb 00000000 00000000

如果随后将这些位添加到
(b[0]中,是否可能存在数据丢失?
(b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]
11111111 11111111 11111111 bbbbbbbb
11111111 bbbbbbbb 00000000 00000000
aaaaaaaa 00000000 00000000 00000000
aaaaaaaa bbbbbbbb 00000000 00000000
b[1] << 16
(b[1] << 16) & 0x00FFFFFF
00000000 bbbbbbbb 00000000 00000000
aaaaaaaa bbbbbbbb 00000000 00000000
(b[0] << 24) + ((b[1] << 16) & 0x00FFFFFF) + ((b[2] << 8) & 0x0000FFFF) + (b[3] & 0x000000FF)