![](/img/trans.png)
[英]Most efficient way to find the index of the only '1' bit in a char variable (in 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:
- 如果设置了待处理的第一位,则调用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.