比特移位> 32比特长

时间:2016-01-12 08:24:30

标签: java bit-manipulation byte bit byte-shifting

我试图从7字节数组中提取前49位。我使用掩码和位移来接近这个字节,如下所示:

long byteVal = ((decryptedVCW[6] & 0xff)&((decryptedVCW[6] & 0xff)<<7)) | ((decryptedVCW[5] & 0xff) << 8) | ((decryptedVCW[4] & 0xff) << 16) | ((decryptedVCW[3] & 0xff) << 24) | ((decryptedVCW[2] & 0xff) << 32) | ((decryptedVCW[1] & 0xff) << 40) | ((decryptedVCW[0] & 0xff) << 48);

其中decryptedVCW是56位字节数组。

屏蔽和位移正如预期的那样工作,直到32位移位&lt;&lt;&lt; 32&#39;

例如,decryptedVCW的十六进制是E865037A9C6424,其中二进制是:

11101000011001010000001101111010100111000110010000100100

当我执行上述移位时,我得到了二进制7AFC6503:

1111010111111000110010100000011

有没有人知道为什么位移会在32位以上分崩离析以及如何解决这个问题?

非常感谢 希夫

1 个答案:

答案 0 :(得分:5)

decryptedVCW[2] & 0xff的类型为int,因为第一个操作数为byte,第二个操作数为int字面值。

<<运算符的第一个操作数为int时,您正在移位int,因此如果第二个操作数为32,则会int溢出

您可以将<<运算符的第一个操作数强制转换为long

(((long)(decryptedVCW[2] & 0xff)) << 32)

或者您可以在long操作中使用long字面值强制第一个操作数为&,如@shmosel所建议的那样:

(decryptedVCW[2] & 0xFFL) << 32