【发布时间】:2016-04-14 19:13:08
【问题描述】:
我对一个名为 OpenBCI 的新 IoT 项目感兴趣,它基本上是一个开源 EEG,用于读取和处理脑电波和其他生物数据。在他们的docs 中,他们声称无线传输的数据(通过 RFDuino)发送 24 位数据。要将 24 位值转换为 32 位有符号整数,他们建议使用以下 Java 友好的 Processing 代码:
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有什么意义?
我想我想更好地理解这个功能!
【问题讨论】:
-
最后一部分是符号扩展的晦涩方式,else 分支是无操作的。更明显的是
newInt = (newInt << 8) >> 8
标签: java processing bitwise-operators bit-shift signed-integer