[英]I'm confused with bitmasks
我正在使用IAR嵌入式工作台和C.我想創建一個掩碼並確定傳輸的下一位是1還是0。
我嘗試了這個,但沒有奏效
int transmit(int signal, int number_of_bits)
{
int mask;
for (int i = 0; i < number_of_bits; i++)
{
mask = pow(2,number_of_bits-1-i)
if ((signal & mask) == 0) // bit '0'
{
transmit0();
}
else // bit '1'
{
transmit1();
}
}
}
我嘗試了這個,它傳輸0001但我試圖傳輸1000(反之亦然)
int transmit(int signal, int number_of_bits)
{
int mask;
for (int i = 0; i < number_of_bits; i++)
{
mask = (1 << i);
if ((signal & mask) == 0) // bit '0'
{
transmit0();
}
else // bit '1'
{
transmit1();
}
}
}
正如@LF注意到的那樣, ^
不是冪運算符,唉<<
,按位移位運算符,就可以了。
這里mask
是一個總是包含“2的冪”值的變量。 目標是始終只在mask
中設置一個位。 該mask
用於測試“隔離”中的每個位。
結合邏輯AND
功能,您可以將其視為一個過濾器,僅為您提供特定位對應的值或零(零)。
請記住,根據定義,僅設置一位的二進制字的值始終對應於冪2值。 因此,在測試單個位后,您將看到零或2的冪值。
讓我們看一下程序運行時的一些實用值(假設為8位)。 所以在for循環中,這就是mask
隨時間變化的值:
00000001
00000010
00000100
00001000
00010000
...
注意:您也可以進入相反的方向,例如,如果接收器想要先看最高位,最后看最低位。 不知道這里需要什么,但你知道。 如果你想反過來,你用(1 << (num_bits-1))
初始化mask
然后每次在循環本身mask >>= 1
)向右走一步。
每個掩碼值與輸入值signal
按位AND
運算( &
運算符),以“濾除”我們感興趣的一個特定位。
記住:這個AND
運算的結果仍然是多位 - 不是一位,所以我們不能找到值1(我們還必須測試情況2,4,8 ......等等)。
例如,假設所有位都打開,那么邏輯AND輸出將如下所示:
00000001 AND 11111111 = 00000001
00000010 AND 11111111 = 00000010
00000100 AND 11111111 = 00000100
00001000 AND 11111111 = 00001000
00010000 AND 11111111 = 00010000
...
請注意在這種情況下結果如何跟隨掩碼。 雖然這些值每次都不同,但是你知道當你得到非零的東西時,你測試的那個位必須很高!
如果所有位都關閉,您將看到:
00000001 AND 00000000 = 00000000
00000010 AND 00000000 = 00000000
00000100 AND 00000000 = 00000000
00001000 AND 00000000 = 00000000
00010000 AND 00000000 = 00000000
您會注意到檢查結果是否為零更容易。 這意味着該位已關閉。 這也是代碼只檢查零值的原因,它知道在所有其他情況下該位為1
!
現在的訣竅是獲得正確的掩碼值。 你需要的是轉變位值的1
留給了正確的位置。 因此,如果您開始測試第4位,您將向左移動4個位置,您將獲得(00010000二進制)。
為此,我們使用位移左運算符<<
。
正如其他人已經說過的那樣, ^
不幸的是做了一些完全不同的事情(XOR),這增加了整個混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.