是否可以使用 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 = truebool4 = false。整体表达式会给出true

您的意思可能是一些 XOR 泛化,但其中有几个。一个可能像你说的那样工作,但更多时候它意味着奇数个。无论如何,大多数编程语言都没有开箱即用。

【讨论】:

以上是关于是否可以使用 XOR 来检测多个条件中的一个是否为真?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript动画-碰撞检测

React中的条件渲染

ACL执行过程

Shiny R中的条件格式多个表

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)