我正在读取加速度计的值并将它们保存在一个名为“值”的缓冲区中。每个加速度计读数都是10位长,但这些值是以字节形式读取的,所以eah加速度计读数实际上是“值”缓冲区中的两个字节或两个值。这是关于如何组合这两个字节以获得一个值的示例代码:
x = ((int)values[1]<<8)|(int)values[0];
我知道我正在组合值[1]和值[2],我很确定(int)部分是将这些部分类型转换为整数(尽管我不确定为什么)。让我感到困惑的部分是<<8
和垂直条|
。这两部分在做什么?
感谢您提供任何解释和帮助!
答案 0 :(得分:3)
这是位掩码。
left shifting (<<)
位values[1]
的值为8
。然后ORing (|)
改为values[0]
中的值。
请采取一些值并尝试解决它们。你会更好地理解它。
这是一个link,用于更多阅读和位操作示例。
答案 1 :(得分:2)
这行代码将两个char组合成一个int,其方式是将第一个char移动8位。
例如,值[0] = 5,值[1] = 1,则读入值应为128 + 5 = 133.因为高字节1表示128.另一种查看方式是:
x = ((int)values[1]<<8) + (int)values[0];
替换或+,它将更具可读性。希望这会有所帮助。
答案 2 :(得分:0)
&lt;&lt;运算符将第二个字节中的位移位8位,例如0000000011111111变为1111111100000000。是二进制“或”运算符,它将每个位置的两个位组合在一起,如果任一位或两个位都为1,则为1。
答案 3 :(得分:0)
例如,以二进制形式读取0101010111
的10位数。
低8位以二进制(= 87十进制)转到values[0] = 01010111
。
高2位转到values[1] = 01
。
从values
恢复原始的10位数:
(int)values[1] << 8 --> 01 << 8 --> 0100000000
values[1]
转换为int(通常为32位),然后向左移<<
8位。
((int)values[1]<<8) | (int)values[0] --> 0100000000 | 01010111
或以垂直表示法表示按位 - 或:
0100000000
| 01010111
------------
0101010111
QED
答案 4 :(得分:0)
你有2个字节(1个字节= 8位)并且你试图读取10位值,这就是为什么你需要2个字节而不是只使用1.当你读取你需要投射的值时2个字节到int所以你可以把它们视为整数值,但是如果value[1]
是3 (00000011)
并且下一个字节value[0]
是227 (11100011)
则存在问题如果你添加它们,你可以得到一个正确的读数,所以你需要将value[1]
向左移位8。
当你将无符号字符/ char /字节移位8时,你最终得到0,所以你需要将value[1]
和value[0]
同时转换为int,所以当你做位移时你最终得到768 (00000011 00000000)
现在|
与value [0]
一起结束
(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995
注意我只使用16位整数,因此示例中没有一堆0。
如果您可以访问编程计算器,它可以帮助您理解为什么需要将这些字节值转换为整数,它也可以帮助您进行一般的转换。如果你有权访问它,我会在Windows计算器应用程序中玩游戏。为了进入程序员视图,请转到view-&gt; programmer。