是否可以使用 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 = true
和 bool4 = false
。整体表达式将给出 true
.
您可能指的是一些 XOR 概括,但其中有几个。一个可能像你说的那样工作,但更多时候它意味着奇数个。不管怎样,大多数编程语言都没有开箱即用。
例如,
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 = true
和 bool4 = false
。整体表达式将给出 true
.
您可能指的是一些 XOR 概括,但其中有几个。一个可能像你说的那样工作,但更多时候它意味着奇数个。不管怎样,大多数编程语言都没有开箱即用。