我对一个名为IoT的新OpenBCI项目感兴趣,它基本上是一个开源的脑电信号,用于读取和处理脑电波和其他生物数据。在他们的文档中,他们声称空中传输的数据(通过RFDuino)发送24位数据。要将24位值转换为32位有符号整数,他们建议使用以下对Java友好的正在处理中代码:
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])
);0xFF值的意义是什么?<<)的目的是什么?第二部分也有点神秘:
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}newInt & 0x00800000?0x00800000的意义是什么if-else基于上述操作的正结果和非负结果?0xFF000000和0x00FFFFFF的意义何在?我想这个函数有很多挥手和魔法,我想更好地理解它!
发布于 2016-04-14 20:00:29
为什么假定输入中有3个字节是安全的?
24位/8位=3字节
0xFF值的意义是什么?
是个小面具。0b11111111以二进制表示。在这种情况下,它被用作将字节值转换为int的快速方法。
左位移位(<<)的目的是什么?
一旦在前面的指令中检索到int值,它就会向左移动16位,以获取int的第三个字节的位置(从右边计数)。这是因为字节数组以大端格式存储字节,其中MSB是第一位的。下一个字节只移动8位来占据第二个字节的位置,而最后一个字节根本不需要移动,因为它已经位于第一个字节位置了。
为什么是newInt & 0x00800000?0x00800000有什么意义?
好的,0x80是另一个位掩码,用于获取某个字节的MSB。0x00800000对应于第三个字节的MSB (即在前一个进程中移动了16位的byteArray[0]中的字节)。这也对应于整个24位值的MSB .
为什么基于上述操作的正结果和非负结果的if- of?
确定24位值的MSB是1还是0将告诉我们,在二补表示法中它分别是负数还是正数。
0xF000000和0x00FFFFF的意义是什么?
如果数字在它的24位表示法中是负值,我们也希望它是负的,作为一个32位的值,在两位的补码中,这就是为什么我们必须用0b11111111 (0xFF)填充第四个字节,也就是使用OR操作符。
如果它已经是正数,那么第四个字节可以是0x00,下面的3个字节与原来的24位值相同--通过使用0x00FFFFFF掩蔽来完成。
https://stackoverflow.com/questions/36631967
复制相似问题