簡體   English   中英

我對bitmasks感到困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM