三个值的异或 [英] XOR of three values
问题描述
什么是做一个三路独家最简单的方法或?
在换句话说,我有三个值,我想结果为true IFF的声明只的这三个值中的一个的是真实的。
到目前为止,这是我想出:
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
有什么简单的做同样的事情?
这里的证明,上面的完成了任务:
A = TRUE; B =真实的; C =真
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;假一个= TRUE; B =真实的; C =假
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;假一个= TRUE; B = FALSE; C =真
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;假一个= TRUE; B = FALSE; C =假
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;真正A = FALSE; B =真实的; C =真
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;假A = FALSE; B =真实的; C =假
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;真正A = FALSE; B = FALSE; C =真
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;真正A = FALSE; B = FALSE; C =假
((A ^二)及;及(一^ C)及和放大器;!(B&安培;和C))|| ((二^一)及和放大器;(二^ C)及和放大器;!(A和和C))|| ((C ^ a)及;及(C ^二)及;&安培;!(A和和b))
= GT;假
有关恰好有三个方面,你可以使用这个前pression:
(A ^ B ^ C)及和放大器; !(A和和B&放大器;和C)
第一部分是真正
当且仅当条件中的一个或三个是真正
。恩pression的第二部分,确保不三者真正
。
请注意,上述前pression没有的不的推广到更多的方面。一个更普遍的解决方案是真正的计数的多少术语真正
,所以是这样的:
INT trueCount =
(1:0)+
(b 1分配:0)+
(三?1:0)+
... //更多条款必要回报(trueCount == 1); //或一定范围内检查前pression等
What is the simplest way to do a three-way exclusive OR?
In other words, I have three values, and I want a statement that evaluates to true IFF only one of the three values is true.
So far, this is what I've come up with:
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
Is there something simpler to do the same thing?
Here's the proof that the above accomplishes the task:
a = true; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = false; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
For exactly three terms, you can use this expression:
(a ^ b ^ c) && !(a && b && c)
The first part is true
iff one or three of the terms are true
. The second part of the expression ensures that not all three are true
.
Note that the above expression does NOT generalize to more terms. A more general solution is to actually count how many terms are true
, so something like this:
int trueCount =
(a ? 1 : 0) +
(b ? 1 : 0) +
(c ? 1 : 0) +
... // more terms as necessary
return (trueCount == 1); // or some range check expression etc
这篇关于三个值的异或的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!