Bitshifting和标志

时间:2016-07-27 16:43:30

标签: scala

让我先从问题开始:

  def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = {
    ((byte4 << 0)) | ((byte3 << 8)) | ((byte2 << 16)) | ((byte1 << 24))
  }

这里的目标非常简单。给定4个字节,将它们打包到Int

上面的代码不起作用,因为看起来移位运算符会尝试保留符号。例如,这个:

word(0xFA.toByte, 0xFB.toByte, 0xFC.toByte, 0xFD.toByte).formatted("%02X")

在我预期FFFFFFFD时生成FAFBFCFD

缩小问题:

0xFE.toByte << 8

以二进制补码生成-2,而不是0xFE00。

如果没有签名问题,我怎样才能进行轮班?

2 个答案:

答案 0 :(得分:4)

使用0xFF的字节来撤消转移前符号扩展的影响:

((byte4 & 0xFF) << 0) | ((byte3 & 0xFF) << 8) | ...

答案 1 :(得分:4)

您的怀疑是正确的,@ user2357112会回答您的问题。

现在,您可以使用ByteBuffer作为一个干净的替代品:

def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = 
  ByteBuffer.wrap(Array(byte1, byte2, byte3, byte4)).getInt