![](/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.