关于C#:设置和清除位的宏

Macros to set and clear bits

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

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


尝试

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

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

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


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

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


呃。您是否没有一组本地函数来为您执行此操作?这将隐藏跨越单词边界时必须发生的任何魔法。

如果失败了,那么上述的失败又是怎样的呢?它们看起来"不错",但如果函数不可用,我还是宁愿手工做这类事情。宏只是在做这种事情时隐藏讨厌的错误。传递有符号与无符号等不会被宏捕获。