我试图从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);其中,解密的VCW是一个56位字节的数组。屏蔽和位移位按预期工作,直到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关于java - 位移大于32位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34738676/ 10-12 01:26