按位运算与C ++中的逻辑运算

时间:2013-09-18 13:30:23

标签: c++ xor

在比较两个整数值时,C ++中的以下语句是否相同?如果没有,为什么?

if(a == b)
  ...do

if(!(a ^ b))
  ...do

2 个答案:

答案 0 :(得分:4)

对于整数值,是的。显然,如果A和B之间存在任何位差异,xor运算符将返回非零,并且!将反转该值。对于整数数据类型,条件是等效的。

对于浮点值,由于你可以执行两个“应该”给出相同结果的数学运算,但它们可以用不同的方式表示为浮点数,你不应该使用其中任何一个来比较浮点数是否相等,你应该检查它们是否在相同的误差范围内(“epsilon”)。

指点......我不知道你为什么要这么做指针。但如果你真的想这样做,那么是的,它们是一样的。

但是,没有理由这样做。启用优化后,它们将编译为相同的代码,而第一个代码可能会更快。为什么要使用不太清晰的!(a^b)

答案 1 :(得分:3)

两次比较是等效的:a^b 0当且仅当a==b时,!(a^b)true当且仅当a和b有相同的价值。

你是否可以称它们为“相同”取决于两个不同的操作是“相同”的意思。它们可能不会被编译成相同的代码,a==b肯定更容易阅读。