我创建了一个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));
}
答案 0 :(得分:4)
isTokenValid()
运算符的优先级高于!=
。
所以您:
&
等效于:
n & (1 << x) != 0
对于给出明确定义结果的n & ((1 << x) != 0)
的任何值,等同于:
x
不是你想要的。
要解决此问题。将您的定义替换为:
n & 1
此外,如果您打算在更复杂的情况下使用此参数,则您的参数可能应该用括号括起来:
(((n & (1 << x)) != 0) ? 1 : 0)
您可以使用以下事实:((((n) & (1 << (x))) != 0) ? 1 : 0)
产生值为!=
或int
的{{1}}:
0
或者,您可以跳过与1
的比较,然后转换为(((n) & (1 << (x))) != 0)
并返回到0
:
bool
或者坚持三元,将比较放到int
:
((int) (bool) ((n) & (1 << (x))))
在后三个中,您选择哪个是意见和偏好问题。
答案 1 :(得分:3)
比较!=
的优先级高于&
,因此首先完成。因此,您的代码正在执行8 & ((1 << 3) != 0)
的{{1}}。您需要添加括号:
8 & 1
现在,您可以将其理解为#define IS_BIT_SET(n,x) (((n & (1 << x)) != 0) ? 1 : 0)
int main(){
printf("%d \n",IS_BIT_SET(8,3));
}
。