用于设置和清除位的宏

时间:2010-06-04 23:32:24

标签: c embedded macros bit-manipulation

我试着编写一些简单的宏来简化设置和清除位的任务,这应该是一项简单的任务,但我似乎无法让它们正常工作。

#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))

3 个答案:

答案 0 :(得分:10)

尝试

#define CLR_BIT(p,n) ((p) &= ~((1) << (n)))

然而,由于一般宏观邪恶的各种原因,我建议不要使用宏。使用内联函数并通过引用传递,如下所示:

static inline void set_bit(long *x, int bitNum) {
    *x |= (1L << bitNum);
}

答案 1 :(得分:8)

一个明显的问题是((p) &= (~(1) << (n)))应为((p) &= ~(1 << (n)))

除此之外,您必须小心整数类型的宽度。如果您使用的是unsigned long,则可能需要使用(例如)((p) |= (1UL << (n)))

答案 2 :(得分:0)

唉。你在本地没有一套功能吗?这将隐藏跳过单词边界时必须发生的任何魔法。

如果失败了,上面的失败怎么办?它们看起来很“好”,但如果功能不可用,我还是宁愿手工做这类事情。在做这类事情时,宏只是隐藏了令人讨厌的错误。传递已签名与未签名等等。不会被宏捕获。