2014-01-30 84 views
0

我正在读取来自加速度计的值并将其保存在名为“值”的缓冲区中。每个加速度计的读数是10位长,但读取的值是字节,所以加速度计读数实际上是'值'缓冲区中的两个字节或两个值。这是关于如何将这些两个字节组合示例代码来获取一个值:有人可以向我解释这一行代码吗?

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

,我感到我正在合并值[1]和值[2],我敢肯定的(INT)部分是类型转换为整数的部分(虽然我不知道为什么)。让我感到困惑的部分是<<8和竖线|。这两部分在做什么?

感谢您的任何解释和帮助,您可以给!

+1

http://www.cprogramming.com/tutorial/bitwise_operators.html – SLaks

回答

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

3

这是一个位掩码

您是left shifting (<<)的值values[1]8位位置。然后ORing (|)它的值为values[0]

请采取一些值,并尝试通过它们。你会更好地理解它。

这是link更多阅读和位操作示例。

2

这行代码将第一个字符移动8位的方式将两个字符组合成int。

例如,值[0] = 5,值[1] = 1,则读入值应该是128 + 5 = 133.因为高字节1表示128.另一种看待它的方法是:

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

替换或用+,它会更具可读性。希望这可以帮助。

0

< <运算符将第二个字节中的位左移8位,例如0000000011111111变成1111111100000000。是二进制“或”运算符,它将每个位置的两位合并为1,如果其中一位或两位均为1.

0

您有2个字节(1个字节= 8位)和你正在试图在一个10到读这就是为什么你需要2个字节而不是仅仅使用1的原因。当你在读取数值时,你需要将2个字节转换为int,这样你可以把它们看作整数值,但是如果value[1]是3 (00000011)而下一个字节value[0]是227 (11100011)如果你加他们,你需要用8

留下当你的点点你最终0 8无符号字符/字符/字节偏移移位value[1]你可以得到一个适当的阅读,所以你需要投既value[1]value[0]为int,所以当你做移位你结束了,现在768 (00000011 00000000)|value [0]和你结束了

(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995 

注意到我只使用16位整数这样的例子ISN” t充满了一堆0。

如果您有权访问编程计算器,它可以帮助您了解为什么需要将这些字节值转换为整数,它也可以帮助您完成一般性的转换。如果你有权访问它,我会用suclock来玩一下windows Calculator应用程序。为了进入程序员视图去查看 - >程序员。

相关问题