我对一个名为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;
}
Run Code Online (Sandbox Code Playgroud)
我想我正在努力了解到底发生了什么.让我们来看看第一段代码:
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
Run Code Online (Sandbox Code Playgroud)
0xFF价值的意义是什么?<<)的目的是什么? …我有一个传感器,它以三个字节输出.我这样看了:
unsigned char byte0,byte1,byte2;
byte0=readRegister(0x25);
byte1=readRegister(0x26);
byte2=readRegister(0x27);
Run Code Online (Sandbox Code Playgroud)
现在我想将这三个字节合并为一个数字:
int value;
value=byte0 + (byte1 << 8) + (byte2 << 16);
Run Code Online (Sandbox Code Playgroud)
它给出了从0到16,777,215的值,但我期望从-8,388,608到8,388,607的值.我虽然int已经通过其实施签署了.即使我尝试定义它signed int value;仍然只给我正数.所以我想我的问题是如何将int转换为它的两个补码?
谢谢!
有人可以解释一下 VHDL 的to_unsigned是如何工作的或者确认我的理解是正确的吗?例如:
C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31))
Run Code Online (Sandbox Code Playgroud)
这是我的理解:
unsigned type-conversion vhdl twos-complement signed-integer
该程序要求C实现回答一个简单的问题:
如果我们检查最大的可重现整数INT_MAX <0并打印它.
printf ("%d\n", (INT_MAX) < 0);
Run Code Online (Sandbox Code Playgroud)
所以,显示输出0.因为条件变为假,关系运算符返回0.
但是,如果我们添加 1到最大的可重现的整数和检查条件,请参阅以下程序.
#include <limits.h>
#include <stdio.h>
int main (void)
{
printf ("%d\n", (INT_MAX+1) < 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并显示输出 1.
为什么条件不会变错?
另外,如果我们将一个加到最大的可重现整数,那么结果是否定的?
我正在移植一些在 uint32_t 上进行取模的 C 代码。uint32_t 按位适合 Java int,但我无法弄清楚如何在不转换为 long 的情况下对其执行模运算。这是我现在的代码:
int i = 0xffffffff;
long asUnsigned = Integer.toUnsignedLong(i);
int mod = (int) (asUnsigned % 42L);
Run Code Online (Sandbox Code Playgroud)
我可以在不转换为长整型的情况下执行此模计算吗?
java bit-manipulation modulo unsigned-integer signed-integer