我正在尝试查找x
从右侧数起的第一位是否为1
,因此我检查x^1
的值是否为1
。然而,
int x=6;
if (x^1!=1)
给出错误的答案,但是
if (int(x^1)!=1)
给出了正确的答案。
我不确定为什么。有人可以给我解释一下吗?
我正在尝试查找x
从右侧数起的第一位是否为1
,因此我检查x^1
的值是否为1
。然而,
int x=6;
if (x^1!=1)
给出错误的答案,但是
if (int(x^1)!=1)
给出了正确的答案。
我不确定为什么。有人可以给我解释一下吗?
这是一个关于运算符优先级的陷阱(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)
则需要使用括号)。
@Cornstalks的回答是正确的。
我刚才有这个想法(实际上并没有解决你的问题,但可以使它更易读):
解决这个问题的另一种方法是简单地使用模运算符:
if(x%2 == 0) // then first bit is 0
else // first bit is 1
^
(按位异或)而不是&
(按位与)?这个测试并没有完全做到你认为的那样。 - Jim Lewis