左/右按位移位 - 为什么我们按字节长度移位

时间:2021-01-15 09:37:20

标签: java bit-manipulation bitwise-operators

我一直在阅读这篇关于网络包中位操作的博客。我有这个代码,我看到它以一个整数读取,通常为 4 字节长(32 位)

public int readInt() {
    return (pData[caret++] & 0xff) << 24 | (pData[caret++] & 0xff) << 16
            | (pData[caret++] & 0xff) << 8 | pData[caret++] & 0xff;
}

为什么我们在读取一个整数值时移动了 8、16 和 24?目标是什么?它实现了什么?

1 个答案:

答案 0 :(得分:1)

那是因为 pData 是一个字节数组。 readInt() 的作用是将 4 个字节打包成一个整数,然后返回结果。因为一个整数是 4 个字节,所以 ((value & 0xFF) << 24) 将设置为第 1 个插槽,((value & 0xFF) << 16) 为第 2 个插槽,((value & 0xFF) << 8) 为第 3 个插槽和 {{1} } 对于最后一个插槽。并且要将这四个值合并为一个(在这种情况下是一个整数),必须在每个值之间执行按位 OR ((value & 0xFF))。如果 pData 确实是一个整数数组,那可能是因为它想使用无符号整数 (0 - 255)。所以 readInt() 所做的就是将每个 int(最多 4 个整数)的 8 个 LSB(最低有效位)打包成一个整数,然后返回结果。