三个值的异或 [英] XOR of three values

查看:819
本文介绍了三个值的异或的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是做一个三路独家最简单的方法或?

在换句话说,我有三个值,我想结果为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆