有人可以向我解释这行代码吗?

时间:2014-01-30 22:53:52

标签: c++ arduino bit-manipulation

我正在读取加速度计的值并将它们保存在一个名为“值”的缓冲区中。每个加速度计读数都是10位长,但这些值是以字节形式读取的,所以eah加速度计读数实际上是“值”缓冲区中的两个字节或两个值。这是关于如何组合这两个字节以获得一个值的示例代码:

x = ((int)values[1]<<8)|(int)values[0];

我知道我正在组合值[1]和值[2],我很确定(int)部分是将这些部分类型转换为整数(尽管我不确定为什么)。让我感到困惑的部分是<<8和垂直条|。这两部分在做什么?

感谢您提供任何解释和帮助!

5 个答案:

答案 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。