我对一个名为OpenBCI的新物联网项目感兴趣,该项目基本上是用于读取和处理脑波和其他生物数据的开源EEG。在他们的docs中,他们声称通过空中传输的数据(通过RFDuino)发送24位数据。到了24位值转换为32位有符号整数,他们提出以下Java友好Processing代码:Java中的24位到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])
);
- 为什么是安全的假设有输入3个字节?
0xFF
值的重要性是什么?- 左移位的目的是什么(
<<
)?
第二段也是一个有点神秘:
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
- 为什么
newInt & 0x00800000
?0x00800000
有什么意义? - 为什么
if-else
基于上述操作的阳性与阴性结果? 0xFF000000
和0x00FFFFFF
是什么意思?
我想这个功能有很多handwaving和magic,我想更好地理解!
最后一部分是签名扩展的一个晦涩的方式,else分支是无操作的。更加明显的是'newInt =(newInt << 8) >> 8' – harold