首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >三值异或

三值异或
EN

Stack Overflow用户
提问于 2010-08-12 09:49:40
回答 9查看 22.1K关注 0票数 41

什么是最简单的方式来做一个三方排他性或?

换句话说,我有三个值,我想要一个计算为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))

有什么更简单的事情可以做同样的事情吗?

以下是上述完成任务的证据:

代码语言:javascript
运行
复制
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
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-08-12 09:54:05

对于确切的三个术语,您可以使用以下表达式:

代码语言:javascript
运行
复制
(a ^ b ^ c) && !(a && b && c)

第一部分是true当且仅当其中一个或三个术语是true。表达式的第二部分确保了并不是所有的三个都是true

请注意,上面的表达式没有泛化为更多的术语。一个更普遍的解决方案是实际计算true有多少个术语,所以如下所示:

代码语言:javascript
运行
复制
int trueCount =
   (a ? 1 : 0) +
   (b ? 1 : 0) +
   (c ? 1 : 0) +
   ... // more terms as necessary 

return (trueCount == 1); // or some range check expression etc
票数 51
EN

Stack Overflow用户

发布于 2010-08-12 09:54:51

代码语言:javascript
运行
复制
bool result = (a?1:0)+(b?1:0)+(c?1:0) == 1;
票数 19
EN

Stack Overflow用户

发布于 2010-08-12 09:53:35

如果不均衡的变量数为1,则a^b^c仅为1(两个“1”将相互抵消)。所以你只需要检查一下“所有三个都是1”的情况:

代码语言:javascript
运行
复制
result = (a^b^c) && !(a&&b&&c)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3466452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档