language-agnostic - 三个值的异或

标签 language-agnostic logic boolean xor boolean-expression

进行三向异或的最简单方法是什么?

换句话说,我有三个值,我想要一个评估为真 IFF 的语句,只有三个值中的一个为真。

到目前为止,这就是我想出的:

((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))

有没有更简单的方法可以做同样的事情?

这是上述完成任务的证明:

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

最佳答案

对于正好三个术语,您可以使用以下表达式:

(a ^ b ^ c) && !(a && b && c)

第一部分是true当条件之一或三个术语是 true .表达式的第二部分确保并非所有三个都是 true .

请注意,上述表达式不能推广到更多术语。一个更通用的解决方案是实际计算 true 有多少项。 ,所以是这样的:
int trueCount =
   (a ? 1 : 0) +
   (b ? 1 : 0) +
   (c ? 1 : 0) +
   ... // more terms as necessary 

return (trueCount == 1); // or some range check expression etc

关于language-agnostic - 三个值的异或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3466452/

相关文章:

python - 进行大多数模拟验证的单元测试是否有异味?

recursion - 快速排序和尾递归优化

javascript - 如何在无序二叉树中搜索节点?

javascript - 增加变量值直到它与 Javascript 中另一个变量的值相匹配的最快方法是什么?

performance - 在Prolog中更快地执行口头算术

boolean - 如何在 COBOL 中返回 true

java - 如果 day 是该月的第一天,Joda 或 Java 如何返回 true?

language-agnostic - 一切都是流?

web-services - 如何阻止开发人员获取多个 API key

MySQL,如何在查询中将 True/False 转换为 1/0