什么是最简单的方式来做一个三方排他性或?
换句话说,我有三个值,我想要一个计算为true的语句,三个值中只有一个是true。
到目前为止,这是我想出的:
((a ^ b) && (a ^ c) &&;(b & c) \x{e76f}\x{e76f} ((b ^ a)和( b) ^c)\x{e76f}\x{e76f} ((c ^ a)和(c ^b)和(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
发布于 2010-08-12 09:54:05
对于确切的三个术语,您可以使用以下表达式:
(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
发布于 2010-08-12 09:54:51
bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;
发布于 2010-08-12 09:53:35
如果不均衡的变量数为1,则a^b^c
仅为1(两个“1”将相互抵消)。所以你只需要检查一下“所有三个都是1”的情况:
result = (a^b^c) && !(a&&b&&c)
https://stackoverflow.com/questions/3466452
复制相似问题