我试图找出x
的右边第一位是1
,因此我会检查x^1
的值是否为1
。但是,
int x=6;
if (x^1!=1)
给出了错误的答案,但是
if (int(x^1)!=1)
给出正确的答案。
我不确定为什么。有人可以为我澄清这个吗?
答案 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
最后,您的任务只是检查偶数或奇数值。