我试着编写一些简单的宏来简化设置和清除位的任务,这应该是一项简单的任务,但我似乎无法让它们正常工作。
#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))
答案 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)
唉。你在本地没有一套功能吗?这将隐藏跳过单词边界时必须发生的任何魔法。
如果失败了,上面的失败怎么办?它们看起来很“好”,但如果功能不可用,我还是宁愿手工做这类事情。在做这类事情时,宏只是隐藏了令人讨厌的错误。传递已签名与未签名等等。不会被宏捕获。