用于设置和清除位的宏

vol*_*ing 4 c embedded macros bit-manipulation

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

#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))
Run Code Online (Sandbox Code Playgroud)

Art*_*ius 10

尝试

#define CLR_BIT(p,n) ((p) &= ~((1) << (n)))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这些*特殊*宏非常安全,因为它们只对每个参数求值一次。 (2认同)
  • 当sizeof(int)<sizeof(long)时,这是否有效?我原以为不会,因为1 << bitNum会溢出. (2认同)

CB *_*ley 8

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

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