检查是否使用 MACRO 设置了某个位

Check if a bit is set using a MACRO

我创建了一个 MACRO 来查看是否设置了某个位。代码正在打印 0 而不是 1。

#define IS_BIT_SET(n,x)   ((n&(1<<x)!=0)?1:0)
int main(){
    printf("%d \n",IS_BIT_SET(8,3));
}

比较 != 的优先级高于 &,所以它先完成。因此,您的代码正在执行 8 & ((1 << 3) != 0),即 8 & 1。您需要添加括号:

#define IS_BIT_SET(n,x)   (((n & (1 << x)) != 0) ? 1 : 0)

int main(){
    printf("%d \n",IS_BIT_SET(8,3));
}

现在它将被理解为(8 & (1 << 3)) != 0,如您所愿。

!= 运算符的优先级高于 &

所以你的:

n & (1 << x) != 0

相当于:

n & ((1 << x) != 0)

其中,对于给出 well-defined 结果的 x 的任何值,等同于:

n & 1

这不是你想要的。

解决这个问题。将您的定义替换为:

(((n & (1 << x)) != 0) ? 1 : 0)

此外,如果您打算在更复杂的情况下使用它,您的论点可能应该用括号括起来:

((((n) & (1 << (x))) != 0) ? 1 : 0)

您可以使用 != 产生值 01:

int,而不是使用三进制
(((n) & (1 << (x))) != 0)

或者,您可以跳过与 0 的比较,转换为 bool 并返回到 int:

((int) (bool) ((n) & (1 << (x))))

或者坚持使用三元,放弃与 0 的比较:

(((n) & (1 << (x))) ? 1 : 0)

你选择最后三个中的哪一个是一个见仁见智的问题。