用于设置和清除位的宏

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

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

尝试

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

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

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

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

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

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

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