我使用以下代码在C中创建一个位图并启用一个位.但问题是,当我正在阅读它时,我获得了比预期更高的位.
#define BITS_PER_WORD (sizeof(uint32_t) * CHAR_BIT)
#define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
#define BIT_OFFSET(b) ((b) % BITS_PER_WORD)
main ()
{
// declarations
int val = 2;
init_bits(&bmp);
set_bit(&bmp,val);
for (id = 0; id < sizeof(bmp); id++)
{
if (bmp & (1 << id))
{
trace(debug, "bit:%x", bmp,);
}
}
}
init_bits(uint32_t *words) {
(void)memset((void*)words, 0, sizeof(uint32_t));
}
set_bit(uint32_t *words, int n) {
words[WORD_OFFSET(n)] |= (1 << BIT_OFFSET(n));
}
Run Code Online (Sandbox Code Playgroud)
所以例如,如果我执行set_bit(&bmp,2)然后我得到4(而不是2)十六进制和10(而不是8)for set_bit(&bmp,4),依此类推.
任何帮助是极大的赞赏!
我认为你的期望是错误的.通常的工作方式是:
请注意,这正是数学base-2-exponent函数的值.
如果您想要任何其他约定,则必须相应地添加或减去.