有人能给我解释一下这行代码吗

Can someone please explain this line of code to me?

本文关键字:一下 代码 解释      更新时间:2023-10-16

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

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

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

感谢您的解释和帮助!

这是一个位掩码

您是left shifting (<<)values[1]中的值乘以8的位位置。然后CCD_ 6将其转换为CCD_。

请接受一些价值观,并努力克服它们。你会更好地理解它的。

这里有一个链接,可以获得更多的阅读和位操作示例。

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

例如,值[0]=5,值[1]=1,则读入值应为128+5=133。因为高字节1意味着128。另一种看待它的方式是:

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

将或替换为+,它将更具可读性。希望这能有所帮助。

以二进制0101010111的10位读取为例。

较低的8位进入二进制(=87十进制)的values[0] = 01010111

较高的2个比特进入CCD_ 10。

values:恢复原来的10位数字

(int)values[1] << 8   -->   01 << 8   -->   0100000000

CCD_ 12被转换为int(通常为32位),然后向左移位CCD_ 13 8位。

((int)values[1]<<8) | (int)values[0]   -->   0100000000 | 01010111

或以垂直表示法来表示按位或:

0100000000
|   01010111
------------
0101010111

QED

<操作员将第二字节中的位向左移位8位,因此例如0000000011111111变为1111111100000000。|是二进制"或"运算符,如果其中一位或两位都为1,则将每个位置的两位组合为1。

您有2个字节(1个字节=8个比特),并且您正在尝试读取10个比特的值,这就是为什么您需要2个字节而不是仅使用1。当你读取值时,你需要将2个字节强制转换为int,这样你就可以像对待整数值一样对待它们,但有一个问题,如果value[1]是3个(00000011),下一个字节value[0]是227个(11100011),如果你将它们相加,你就可以得到正确的读数,所以你需要将value[1]左移8位。

当你将一个无符号的char/char/字节位移8时,你会得到0,所以你需要将value[1]value[0]都强制转换为int,所以当你进行位移时,你最终会得到768个(00000011 00000000),现在你是|,而不是value [0],最后你会得到

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

注意,我只使用了16位int,所以这个例子并没有充满一堆0。

如果您可以访问编程计算器,它可以帮助您理解为什么需要将这些字节值强制转换为int,它也可以帮助您进行一般的强制转换。如果你可以访问windows Calculator应用程序,我建议你玩一玩它。为了让它进入程序员视图,请转到查看->程序员。