Java中的24位到32位转换

Java中的24位到32位转换,java,processing,bitwise-operators,bit-shift,signed-integer,Java,Processing,Bitwise Operators,Bit Shift,Signed Integer,我对一个名为IoT的新项目感兴趣,它基本上是一个开源EEG,用于读取和处理脑电波和其他生物数据。在他们的研究中,他们声称通过无线传输的数据(通过RFDuino)发送24位数据。要将24位值转换为32位有符号整数,他们建议使用以下Java友好代码: 为什么newInt&0x00800000?0x00800000的意义是什么 为什么if-else基于上述操作的正结果与非负结果 0xFF000000和0x00FFFFFF的意义是什么 我想这个函数中有很多手工操作和魔法,我希望能更好地理解 为什么假

我对一个名为IoT的新项目感兴趣,它基本上是一个开源EEG,用于读取和处理脑电波和其他生物数据。在他们的研究中,他们声称通过无线传输的数据(通过RFDuino)发送24位数据。要将24位值转换为32位有符号整数,他们建议使用以下Java友好代码:

  • 为什么
    newInt&0x00800000
    0x00800000
    的意义是什么
  • 为什么
    if-else
    基于上述操作的正结果与非负结果
  • 0xFF000000
    0x00FFFFFF
    的意义是什么
我想这个函数中有很多手工操作和魔法,我希望能更好地理解

为什么假设输入中有3个字节是安全的

24位/8位=3字节

0xFF值的意义是什么

这有点像面具<二进制代码>0b11111111。在这种情况下,它被用作将字节值转换为int的快速方法


左位移位的目的是什么(最后一部分是一种模糊的符号扩展方式,else分支是一个不可操作的分支。更明显的是
newInt=(newInt>8
Awesome,Awesome answer@James Buck(+1)-谢谢!我只是好奇,如果我是用Java实现的,并且需要一个单元测试来确认这是否有效,我在哪里可以找到24位有符号整数及其相应的32位有符号值,以验证测试结果?:-)再次感谢!@smeeb您可以选择任意24位随机数,将其放入2的补码二进制到十进制转换器中,例如。然后您可以将相同的二进制数放入3字节数组中,上面的代码应将其转换为与计算器值完全相同的32位整数。此代码将确保任何24位值都具有val值ue在转换为32位格式时保留。
int interpret24bitAsInt32(byte[] byteArray) {
    int newInt = (
        ((0xFF & byteArray[0]) << 16) |
        ((0xFF & byteArray[1]) << 8) |
        (0xFF & byteArray[2])
    );

    if ((newInt & 0x00800000) > 0) {
        newInt |= 0xFF000000;
    } else {
        newInt &= 0x00FFFFFF;
    }

    return newInt;
}
int newInt = (
    ((0xFF & byteArray[0]) << 16) |
    ((0xFF & byteArray[1]) << 8) |
    (0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) {
    newInt |= 0xFF000000;
} else {
    newInt &= 0x00FFFFFF;
}