代码之家  ›  专栏  ›  技术社区  ›  volting

设置和清除位的宏

  •  3
  • volting  · 技术社区  · 14 年前

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

    #define SET_BIT(p,n) ((p) |= (1 << (n)))
    #define CLR_BIT(p,n) ((p) &= (~(1) << (n)))
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Artelius    14 年前

    尝试

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

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

    static inline void set_bit(long *x, int bitNum) {
        *x |= (1L << bitNum);
    }
    
        2
  •  8
  •   CB Bailey    14 年前

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

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

        3
  •  0
  •   Michael Dorgan    14 年前

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

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