如何将Exclusive-OR(XOR)运算符应用于多个谓词?

时间:2012-11-25 00:17:24

标签: c operators

我想知道有没有办法将Exclusive-OR(对于两个操作数称为XOR)运算符应用于多个谓词?

例如,假设pqr是三个谓词(换句话说是布尔变量)。我想写一个if这样的条件:

if ((p || q || r) && !(p && q && r))

即。如果其中至少有一个是真的但不是全部,我希望条件成立。

显然if (p ^ q ^ r)无效(考虑案例p=trueq=truer=false

谢谢。


我对 c 语言给出了一个很好的答案,但我很有兴趣知道 c#是否有解决方案?

3 个答案:

答案 0 :(得分:3)

这是一种方法:

if ((!!p + !!q + !!r) % 3)

但这对自己的好处来说可能太聪明了。

编辑:

if (((p ? 1 : 0) + (q ? 1 : 0) + (r ? 1 : 0)) % 3 != 0)  // C#-compatible version

答案 1 :(得分:2)

你想要的实际上不是将XOR应用于三个或更多个参数,因此标题中的问题具有误导性。 XOR的推广基本上是检查真值的数量是否为奇数,这是(p ^ q ^ r)表达式计算的结果。

C没有任何操作员可以检查你的情况(“至少其中一个是真的,但不是全部的”),所以你的符号:

((p || q || r) && !(p && q && r))

似乎是C中最惯用的。

答案 2 :(得分:-2)

if (((p ^ q) ^ r)&!(p&q&r)) should work in your example

http://en.wikipedia.org/wiki/Exclusive_or