gpt4 book ai didi

c - 在 C 中进行位检查的最正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:34 25 4
gpt4 key购买 nike

我在看一本书《Linux Kernel. Development. Third Edition》。罗伯特·洛夫。

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. If the first bit in pending is set, h->action(h) is called

我有以下代码来检查是否像书中那样设置了位:

#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)

最佳答案

I always check if bit set with this one: if (bits & (1 << n))

这会检查 n -第位到位;然而,书中的代码在使用 bits & 1 进行检查之前将该位移动到最低有效位的位置。 .换句话说,当代码到达 if (bits & 1)bits 的值已经移动,使得感兴趣的位处于 1-s 位置。

这类似于您的其他支票

if ((bit >> n) & 1)

除了(bit >> n)部分是通过执行 bit >>= 1 完成的操作n循环多次。

请注意,为了让这段代码正常工作bit必须是无符号的。

So from several option which should I use and what exactly last one check?

您误解了最后一次检查:它没有检查位 n , 它正在检查 bit针对 n 的整个位模式的二进制表示。

关于c - 在 C 中进行位检查的最正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53159238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com