2017-07-25 57 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,如預期。