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

8

我正在尝试查找x从右侧数起的第一位是否为1,因此我检查x^1的值是否为1。然而,

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

给出错误的答案,但是

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

给出了正确的答案。

我不确定为什么。有人可以给我解释一下吗?


3
请查阅运算符优先级。 - πάντα ῥεῖ
3
为什么你正在使用 ^(按位异或)而不是 &(按位与)?这个测试并没有完全做到你认为的那样。 - Jim Lewis
2
查一下那个运算符的作用,你需要按位与而不是按位异或! - Ulrich Eckhardt
我刚刚意识到,在布尔代数中,“^”符号经常被用作“AND”运算符,所以我的猜测并不那么糟糕。但是在C++中进行位掩码操作时,你需要使用“&”。 - Jim Lewis
有趣的小知识:为什么运算符优先级不是逻辑上的?(程序员 Stack Exchange) - MicroVirus
3个回答

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并不相同。

如果您的目标是检查第一位,我建议使用按位与运算符(&)。 然后您只需执行if (x & 1)(但要注意,混合使用&==会导致您之前遇到的相同问题,因此如果要编写if ((x & 1) == 1)则需要使用括号)。


0

简单来说,!= (不等关系运算符) 的优先级高于 ^ (异或位运算符)。请查看优先级

int x=6;

情况1:if (x^1!=1)

首先,1!=1是0;然后6^0=6。(110 ^ 000 = 110); 检查异或表

情况2:if (int(x^1)!=1)

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


感谢@Cornstalks您的提醒,我已纠正了它。 - Kulamani

0

@Cornstalks的回答是正确的。

我刚才有这个想法(实际上并没有解决你的问题,但可以使它更易读):

解决这个问题的另一种方法是简单地使用模运算符:

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

最终你的任务只是检查偶数或奇数值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接