>32 位长的位移位
Bit shifting for >32 bit long
我正在尝试从 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 位移位“<<32”。
例如,解密后的 VCW 的十六进制为 E865037A9C6424,其二进制为:
11101000011001010000001101111010100111000110010000100100
当我执行上述移位时,我得到二进制的 7AFC6503:
1111010111111000110010100000011
有谁知道为什么移位在 32 向上时会崩溃以及如何解决这个问题?
非常感谢
希夫
decryptedVCW[2] & 0xff
的类型是 int
,因为第一个操作数是 byte
,第二个是 int
文字。
当 <<
运算符的第一个操作数是 int
时,你正在移动一个 int
,所以如果第二个操作数是 32,你将得到 int
溢出。
您可以将 <<
运算符的第一个操作数转换为 long
:
(((long)(decryptedVCW[2] & 0xff)) << 32)
或者您可以按照@shmosel 的建议,通过在 &
操作中使用 long
文字来强制第一个操作数成为 long
:
(decryptedVCW[2] & 0xFFL) << 32
我正在尝试从 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 位移位“<<32”。
例如,解密后的 VCW 的十六进制为 E865037A9C6424,其二进制为:
11101000011001010000001101111010100111000110010000100100
当我执行上述移位时,我得到二进制的 7AFC6503:
1111010111111000110010100000011
有谁知道为什么移位在 32 向上时会崩溃以及如何解决这个问题?
非常感谢 希夫
decryptedVCW[2] & 0xff
的类型是 int
,因为第一个操作数是 byte
,第二个是 int
文字。
当 <<
运算符的第一个操作数是 int
时,你正在移动一个 int
,所以如果第二个操作数是 32,你将得到 int
溢出。
您可以将 <<
运算符的第一个操作数转换为 long
:
(((long)(decryptedVCW[2] & 0xff)) << 32)
或者您可以按照@shmosel 的建议,通过在 &
操作中使用 long
文字来强制第一个操作数成为 long
:
(decryptedVCW[2] & 0xFFL) << 32