簡體   English   中英

在C中進行位檢查的最正確方法

[英]Most correct way for bit checking in C

我讀了一本書“ Linux內核。開發。第三版”。 羅伯特·洛夫(Robert Love)。

softirq部分中,注釋下一段代碼:

    u32 pending;
    pending = local_softirq_pending();

    if (pending) {
            struct softirq_action *h;
            /* reset the pending bitmask */
            set_softirq_pending(0);
            h = softirq_vec;
            do {
                    if (pending & 1) /* STEP 4 */
                            h->action(h);
                    h++;
                    pending >>= 1;
            } while (pending);
    }

他一步一步描述發生了什么,對我來說最不清楚的一步是4:

  1. 如果設置了待處理的第一位,則調用h-> action(h)

我有以下代碼來檢查書中是否設置了位:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BIT_SET(n) ((1) << (n))
#define BIT_CLEAR(n) ~((1) << (n))

int main(void)
{
        unsigned char bits = 0x0;

        bits |= BIT_SET(1);

        if (bits & (1 << 1))
                printf("TEST CHECK SET 1\n");

        if (bits & 1)
                printf("TEST CHECK SET 2\n");

        bits &= BIT_CLEAR(1);

        if (!(bits >> 1) & 1UL)
                printf("BITS UNSET\n");

        return 0;
}

編譯為:

gcc main.c -O0 -Wall -Wextra -Werror. 

我總是檢查是否與此位設置:

if (bits & (1 << n)) 

我的代碼將輸出如下所示:

TEST CHECK SET 1
BITS UNSET

為什么if (bits & 1)陳述不起作用?:

因此,從幾個選項中我應該使用哪個以及最后一個檢查到底是什么?

if (bit & (1 << n))

if ((bit >> n) & 1)

if (bit & n) 

我總是檢查是否將此位設置為: if (bits & (1 << n))

這將檢查第n位; 但是,本書中的代碼會在用bits & 1進行校驗之前將位移到最低有效位位置。 換句話說,到代碼到達if (bits & 1)bits的值已經移位,以使感興趣的位位於1-s位置。

這類似於您的其他支票

if ((bit >> n) & 1)

除了(bit >> n)部分是通過在循環中執行n bit >>= 1次操作來完成的。

請注意,為了使此代碼正常工作,必須對bit進行無符號簽名。

因此,從幾個選項中我應該使用哪個以及最后一個檢查到底是什么?

你曲解了最后一次檢查:它不檢查位n ,它的檢查bit對整個位模式n的二進制表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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