所以你要了解规定的操作。让我们来看看,如果我们可以澄清这一点,通过检查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]
MMMM
(0001
=十进制1),和包含payload[1]
LLLLLLLL
(00000000
=十进制0)。
如果输入是
pin5 101110010001
MMMMLLLLLLLL
代替,你会发现在payload[0]
:1011
(十进制8 + 2 + 1 = 11),和在payload[1]
:10010001
(十进制128 + 16 + 1 = 145) 。
你会解释这个结果为十进制11 * 256 + 145 = 2961,从二进制转换原来的101110010001时为十进制,例如使用编程模式calc.exe
(Alt+3
)你得到,如果你使用的是Windows相同的结果。
同样,您的原始数据被解释为1 * 256 + 0 = 256,如预期。
'pin5'类型和'analogRead'函数的返回类型是什么?请编辑您的问题以提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – Akira
'有效载荷[0] == 1,[1] == 0' - 就像这些位写入文本一样 –
有很多关于按位操作的指南可用。你没有提供什么'pin5'的信息,最好的情况是,人们不得不猜测使用按位操作的结果是什么。 – Peter