首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >24位到32位的Java转换

24位到32位的Java转换
EN

Stack Overflow用户
提问于 2016-04-14 19:13:08
回答 1查看 2.1K关注 0票数 3

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

代码语言:javascript
复制
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;
}

我想我是想弄清楚到底是怎么回事。让我们先来看看代码的第一个部分:

代码语言:javascript
复制
int newInt = (
    ((0xFF & byteArray[0]) << 16) |
    ((0xFF & byteArray[1]) << 8) |
    (0xFF & byteArray[2])
);
  • 为什么假定输入中有3个字节是安全的?
  • 0xFF值的意义是什么?
  • 左位移位(<<)的目的是什么?

第二部分也有点神秘:

代码语言:javascript
复制
if ((newInt & 0x00800000) > 0) {
    newInt |= 0xFF000000;
} else {
    newInt &= 0x00FFFFFF;
}
  • 为什么是newInt & 0x008000000x00800000的意义是什么
  • 为什么if-else基于上述操作的正结果和非负结果?
  • 0xFF0000000x00FFFFFF的意义何在?

我想这个函数有很多挥手和魔法,我想更好地理解它!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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掩蔽来完成。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36631967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档