所以你要了解規定的操作。讓我們來看看,如果我們可以澄清這一點,通過檢查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