2017-07-25 131 views
-2
uint8_t payload[] = { 0, 0 }; 
pin5 = analogRead(A0); 
payload[0] = pin5 >> 8 & 0xff; 
payload[1] = pin5 & 0xff; 

这是来自GitHub上由andrewrapp发布的XBee库中的代码。我想知道按位操作是如何工作的。 所以假设引脚5得到的模拟值为256,因为我使用的是粒子光子板,它的格式为12位,文本为000100000000,所以有效载荷[0]得到的是最后8位,即00000000,还是在移位后得到值即,00000001?还有什么成为有效载荷的价值[1]?了解按位运算 - 移位和AND

我想添加一个4位的代码,使用一个位掩码到数组中的前四位,然后是数据位。我可以&有效载荷[1]为0X1到有效载荷[1]吗?

+1

'pin5'类型和'analogRead'函数的返回类型是什么?请编辑您的问题以提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – Akira

+0

'有效载荷[0] == 1,[1] == 0' - 就像这些位写入文本一样 –

+0

有很多关于按位操作的指南可用。你没有提供什么'pin5'的信息,最好的情况是,人们不得不猜测使用按位操作的结果是什么。 – Peter

回答

0

在你的例子反向pin5的两个字节的内容转换成​​阵列的代码:最显著字节放入payload[0]和至少显著字节被置入payload[1]

如果,例如,pin50x0A63,然后​​将包含0x630x0A

如果pin5具有12位值,则可以使用它的四个最高有效位来存储您自己的四位值。为了确保高位清零,使用0x0F面膜代替0xFF

payload[0] = pin5 >> 8 & 0x0f; 
//      ^

现在你可以用|运营商移动数据到上四位:

payload[0] |= myFourBits << 4; 
0

所以你要了解规定的操作。让我们来看看,如果我们可以澄清这一点,通过检查pin5变量,并细分为两个部分:

pin5    000100000000 
        MMMMLLLLLLLL 

M = 4最显著位,L = 8个最低显著位

payload[0]取结果在pin5一些操作:

pin5    000100000000 
>> 8    000000000001 Shifts all bits 8 positions to the right 
        00000000MMMM and fills the left part with zeroes 

所以你原本领先4个比特现在右对齐,在其上进行额外的操作:

    000000000001 
& 0xFF   000011111111 Anding with FF 
        000000000001 

右移12位变量8位留下4个重要位置;前8位将始终为0. 0xFF是二进制11111111,即表示8个置位。那么在这里完成的是使用8个最低有效位的4个最低有效位,以确保4个最高有效位被擦除。

    00000000xxxx Potentially set bits (you have 0001) 
        000011111111 & 0xFF 
        00000000xxxx Result 
         0000xxxx Storing in 8-bits variable 
payload[0] =   00000001 in your case 

在这种情况下,And荷兰国际集团的操作是没有用的和完全是浪费时间,因为And荷兰国际集团与0xFF任何变量以任何方式并不会改变它的8个最低显著位,自4最显著无论如何比特不会被设置,在这个操作中根本没有意义。(技术上说,因为源是一个12位变量(假设它是一个16位变量,但只有12个重要(相关)二进制数字),0x0F就可以满足And的掩码。 ?为什么,但即使这样,简直是一个浪费CPU周期)

payload[1]还需要一个操作上pin5结果:

pin5    MMMMLLLLLLLL potentially set bits 
& 0xFF   000011111111 mask to keep LLLLLLLL only 
        0000LLLLLLLL result (you have 00000000) 
         xxxxxxxx Storing in 8-bits variable 
payload[1] =   00000000 in your case 

在这种情况下,安定与11111111非常有意义,因为它丢弃MMMM,wh ich在你的情况下是0001

因此,总而言之,你的值

pin5    000100000000 
        MMMMLLLLLLLL 

被分割,例如,其包含payload[0]MMMM0001 =十进制1),和包含payload[1]LLLLLLLL00000000 =十进制0)。

如果输入是

pin5    101110010001 
        MMMMLLLLLLLL 

代替,你会发现在payload[0]1011(十进制8 + 2 + 1 = 11),和在payload[1]10010001(十进制128 + 16 + 1 = 145) 。

你会解释这个结果为十进制11 * 256 + 145 = 2961,从二进制转换原来的101110010001时为十进制,例如使用编程模式calc.exeAlt+3)你得到,如果你使用的是Windows相同的结果。

同样,您的原始数据被解释为1 * 256 + 0 = 256,如预期。