是否可以使用 XOR 来检测多个条件中的一个是否为真?

Is it possible to use XOR to detect if exactly one of multiple conditions is true?

例如,

if (bool1 ^ bool2 ^ bool3 ^ bool4)
{
    // Do whatever
}

只有满足其中一个条件时才应该执行。

将布尔值作为整数相加并检查它们是否等于 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
}

作为替代方案,这里有一个基于流的解决方案:

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) 方法。

您的表达方式无效,因为它的意思是

(((bool1 ^ bool2) ^ bool3) ^ bool4)

假设 bool1 = bool2 = bool3 = truebool4 = false。整体表达式将给出 true.

您可能指的是一些 XOR 概括,但其中有几个。一个可能像你说的那样工作,但更多时候它意味着奇数个。不管怎样,大多数编程语言都没有开箱即用。