繁体   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