在C ++中,if(x ^ 1!= 1)和if(int(x ^ 1)!= 1)之间有什么区别?

时间:2016-01-17 21:37:56

标签: c++ bitwise-operators

我试图找出x的右边第一位是1,因此我会检查x^1的值是否为1。但是,

int x=6; 
if (x^1!=1) 

给出了错误的答案,但是

if (int(x^1)!=1) 

给出正确的答案。

我不确定为什么。有人可以为我澄清这个吗?

3 个答案:

答案 0 :(得分:13)

这是operator precedence的陷阱。运算符优先级确定操作如何“分组”(例如2*3+4如何导致2*3被“分组”在一起。添加括号会更改事物的“分组”方式(例如,2*(3+4)会导致3+4被“分组”在一起。

x^1!=1相当于x^(1!=1),可以简化为x^0

int(x^1)!=1相当于(x^1)!=1(因为您在这里手动添加了括号; int部分不是很相关;它是重要的括号。)

如您所见,x^(1!=1)(x^1)!=1不一样。

如果您的目标是检查第一位,我可能会建议使用按位AND(&)。然后,您可以if (x & 1)(但要注意,混合&==会导致出现与之前相同的问题,因此如果要编写{{1},请使用括号})。

答案 1 :(得分:0)

简单地说,!=(不等于关系运算符)的优先级高于^(XOR位运算符)。 Check precedence

int x=6;

案例1: if (x^1!=1)

首先,1!=1 is 0;然后6^0= 6。 (110 ^ 000 = 110); Check XOR table

案例2: if (int (x^1)!=1)

首先,x^1= 7;然后7!=1 is 1(真)。

答案 2 :(得分:0)

@Cornstalks的回答是正确的。

我只是考虑到了这一点(它实际上并没有回答你的问题,但可以让它更具可读性):

解决此问题的另一种方法是使用模运算符:

if(x%2 == 0)  // then first bit is 0
else  // first bit is 1 

最后,您的任务只是检查偶数或奇数值。