我使用以下代码在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));
}
所以例如,如果我执行set_bit(&amp; bmp,2),那么我得到4(而不是2)的十六进制和10(而不是8)的set_bit(&amp; bmp,4)等等。 / p>
非常感谢任何帮助!
答案 0 :(得分:5)
我认为你的期望是错误的。通常的工作方式是:
请注意,这正是数学 base-2-exponent 函数的值。
如果您需要任何其他约定,则必须相应地添加或减去。