是否可以使用 XOR 来检测多个条件中的一个是否为真?
Posted
技术标签:
【中文标题】是否可以使用 XOR 来检测多个条件中的一个是否为真?【英文标题】:Is it possible to use XOR to detect if exactly one of multiple conditions is true? 【发布时间】:2017-07-16 13:32:54 【问题描述】:例如,
if (bool1 ^ bool2 ^ bool3 ^ bool4)
// Do whatever
只有在满足其中一个条件时才应该执行。
【问题讨论】:
可以这样写,但它可能不会做你想做的事。建立一个真值表,向您展示所有 16 种组合的结果,以决定这是否是您想要的。您的陈述“仅当满足其中一个条件” 是模棱两可的。正如所写,一个简单的包容性或就足够了。您的意思是“仅当满足其中一个条件时”? 你为什么不试试,然后告诉我们?或者尝试后有问题再回来。 @Esko,它不是重复的。 ...嗯,是的。我承认点击了错误的东西。 BRB :) @beta 见***.com/a/21384722/44523 【参考方案1】:将布尔值作为整数相加并检查它们是否等于 1。
在无法从布尔值转换为整数的语言中,例如 Java,更冗长的选项是:
if ((bool1 ? 1 : 0) + (bool2 ? 1 : 0) + (bool3 ? 1 : 0) + (bool4 ? 1 : 0) == 1)
// only runs when one of bool 1-4 is true
但是,在将布尔值转换为整数有效的其他语言中,您可以执行以下操作:
if ((int)(bool1) + (int)(bool2) + (int)(bool3) + (int)(bool4) == 1)
// only runs when one of bool 1-4 is true
【讨论】:
因为它被标记为java
,所以“从布尔值转换为整数不起作用的语言”是给定的。
@LewBloch,回答者可能不太了解 Java,并通过这句话使他的回答笼统,以便它可以应用于多种语言。
我没有在 Java 中测试就回答了这个问题,意识到强制转换不起作用,然后给出了另一个解决方案。不过我会更新答案!【参考方案2】:
作为替代方案,这里有一个基于流的解决方案:
boolean b0 = false;
boolean b1 = false;
boolean b2 = true;
boolean b3 = false;
boolean result = Stream.of(b0, b1, b2, b3)
.mapToInt(b -> b ? 1 : 0)
.sum() == 1;
System.out.println(result);
它的优点是可以很容易地应用于 3 或 5 个布尔值,或者一般地实现布尔 exactlyOne(boolean ... b)
方法。
【讨论】:
.reduce(Integer::sum).getAsInt()
可以写成.sum()
,因为此时我们已经有了IntStream
,不是吗?
@Hulk 对,那就更好了【参考方案3】:
你的表达不会起作用,因为它意味着
(((bool1 ^ bool2) ^ bool3) ^ bool4)
假设bool1 = bool2 = bool3 = true
和bool4 = false
。整体表达式会给出true
。
您的意思可能是一些 XOR 泛化,但其中有几个。一个可能像你说的那样工作,但更多时候它意味着奇数个。无论如何,大多数编程语言都没有开箱即用。
【讨论】:
以上是关于是否可以使用 XOR 来检测多个条件中的一个是否为真?的主要内容,如果未能解决你的问题,请参考以下文章