检查是否使用 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)
您可以使用 !=
产生值 0
或 1
:
的 int
,而不是使用三进制
(((n) & (1 << (x))) != 0)
或者,您可以跳过与 0
的比较,转换为 bool
并返回到 int
:
((int) (bool) ((n) & (1 << (x))))
或者坚持使用三元,放弃与 0
的比较:
(((n) & (1 << (x))) ? 1 : 0)
你选择最后三个中的哪一个是一个见仁见智的问题。
我创建了一个 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)
您可以使用 !=
产生值 0
或 1
:
int
,而不是使用三进制
(((n) & (1 << (x))) != 0)
或者,您可以跳过与 0
的比较,转换为 bool
并返回到 int
:
((int) (bool) ((n) & (1 << (x))))
或者坚持使用三元,放弃与 0
的比较:
(((n) & (1 << (x))) ? 1 : 0)
你选择最后三个中的哪一个是一个见仁见智的问题。