【问题标题】:Bit shifting for >32 bit long位移大于 32 位长
【发布时间】:2016-01-12 08:24:30
【问题描述】:

我正在尝试从 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 位移位“

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

11101000011001010000001101111010100111000110010000100100

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

1111010111111000110010100000011

有谁知道为什么位移在 32 以上时会崩溃以及如何解决这个问题?

非常感谢 湿婆

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    或者您可以按照@shmosel 的建议,通过在&amp; 操作中使用long 文字来强制第一个操作数为long

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

    【讨论】:

    • 或者你也可以0xFFL
    • @shmosel 是的。我没想到。
    • 很好的解释和解决方案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 2015-07-17
    • 2019-04-16
    • 2011-02-08
    • 2014-08-13
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多