检查是否使用MACRO

时间:2019-07-19 17:52:13

标签: c bitmap

我创建了一个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));
}

2 个答案:

答案 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)); }