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

时间:2017-02-25 18:59:35

标签: java boolean-logic xor

如,

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

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

3 个答案:

答案 0 :(得分:8)

将bool作为整数加在一起,检查它们是否等于1。

在从布尔到整数的转换不起作用的语言中,例如Java,更长的winded选项是:

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
}

答案 1 :(得分: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)方法。

答案 2 :(得分:0)

你的表达不起作用,因为它意味着

IntPtr currentSession = SessionInfoPtr;

假设(((bool1 ^ bool2) ^ bool3) ^ bool4) bool1 = bool2 = bool3 = true。总体表达式将给出bool4 = false

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