Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 谁能给我解释一下这行代码吗?_C++_Arduino_Bit Manipulation - Fatal编程技术网

C++ 谁能给我解释一下这行代码吗?

C++ 谁能给我解释一下这行代码吗?,c++,arduino,bit-manipulation,C++,Arduino,Bit Manipulation,我从加速计中读取值,并将它们保存在一个名为“值”的缓冲区中。每个加速计读数为10位长,但值以字节形式读取,因此eah加速计读数实际上是两个字节或“值”缓冲区中的两个值。这是关于如何组合这两个字节以获得一个值的示例代码: x = ((int)values[1]<<8)|(int)values[0]; x=((int)值[1]这是一个位掩码 您正在左移(这是一个位掩码) 您是左移(这行代码将两个字符组合成一个整数,第一个字符移动8位 例如,值[0]=5,值[1]=1,则读入值应为128

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

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

x=((int)值[1]这是一个位掩码


您正在
左移(这是一个位掩码


您是左移(这行代码将两个字符组合成一个整数,第一个字符移动8位

例如,值[0]=5,值[1]=1,则读入值应为128+5=133。因为高字节1表示128。另一种方式是:

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

x=((int)values[1]这行代码将两个字符组合成一个int,第一个字符移动8位

例如,值[0]=5,值[1]=1,则读入值应为128+5=133。因为高字节1表示128。另一种方式是:

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

x=((int)值[1]以二进制的
0101010111
的10位读取为例

较低的8位以二进制(=87十进制)的形式进入
值[0]=01010111

较高的2位进入
值[1]=01

要从
值中恢复原始的10位数字

(int)values[1] << 8   -->   01 << 8   -->   0100000000
或用垂直符号表示按位或:

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

QED

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

较低的8位以二进制(=87十进制)的形式进入
值[0]=01010111

较高的2位进入
值[1]=01

要从
值中恢复原始的10位数字

(int)values[1] << 8   -->   01 << 8   -->   0100000000
或用垂直符号表示按位或:

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

您有2个字节(1字节=8位),并且您正试图读取10位的值,这就是为什么您需要2个字节而不是仅使用1。当您读取值时,您需要将2个字节转换为int,以便可以将其视为整数,但如果
值[1]
为3
(00000011),则会出现问题
下一个字节
值[0]
是227
(11100011)
如果添加它们,可以获得正确的读数,因此需要将
值[1]
左移位8位

当你将一个无符号字符/字符/字节进行8位移位时,你得到的结果是0,因此你需要将
值[1]
值[0]
都转换为int,所以当你进行位移位时,你得到的结果是768
(00000011 00000000)
现在你得到了
值[0]
,你得到的结果是

(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995
请注意,我只使用16位整数,因此示例中不包含大量0

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

您有2个字节(1字节=8位),您试图读入一个10位的值,这就是为什么您需要2个字节而不是仅使用1。当您读入值时,您需要将2个字节转换为int,以便您可以将它们视为整数和整数,但如果
值[1]
为3
(000000 11),则存在一个问题
下一个字节
值[0]
是227
(11100011)
如果添加它们,可以获得正确的读数,因此需要将
值[1]
左移位8位

当你将一个无符号字符/字符/字节进行8位移位时,你得到的结果是0,因此你需要将
值[1]
值[0]
都转换为int,所以当你进行位移位时,你得到的结果是768
(00000011 00000000)
现在你得到了
值[0]
,你得到的结果是

(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995
请注意,我只使用16位整数,因此示例中不包含大量0

如果您可以访问编程计算器,它可以帮助您理解为什么需要将这些字节值强制转换为整数,它还可以帮助您进行一般的强制转换。如果您可以访问windows计算器应用程序,我建议您使用它玩一会儿。要想将其转换到“程序员”视图中,请转到“查看->程序员”