4

通常在我的代码中,我需要检查 x 个布尔值的状态是否全部为真或所有布尔值都为假。所以我这样做:

BOOL first, second, third;
if((first && second && third) || (!first && !second && !third))
     //do something

作为一个懒惰的程序员,我想知道这种查询是否有一些数学简写,而不是每次都必须输入整个内容?

4

4 回答 4

5

所有布尔值相同的简写是测试(成对)相等性:

(first==second && second==third)

当然,您可以将其扩展为任意数量的布尔值,将N-1相等检查与and运算符结合使用。

于 2012-08-26T16:44:03.887 回答
3

如果这是您经常需要的东西,那么您最好使用整数并单独读取位。

例如,而不是:

BOOL x; // not this
BOOL y; // not this
BOOL z; // not this

...而不是位字段(因为它们的布局是实现定义的):

unsigned int x : 1; // not this
unsigned int y : 1; // not this
unsigned int z : 1; // not this

...使用单个字段,例如:

unsigned int flags; // do this

...并将每个值分配给一个位;例如:

enum { // do this
  FLAG_X = (1 << 0),
  FLAG_Y = (1 << 1),
  FLAG_Z = (1 << 2),
  ALL_FLAGS = 0x07 // "all bits are on"
};

然后,要测试“全部为假”,您只需说“ if (!flags)”,要测试“全部为真”,您只需说“ if (flags == ALL_FLAGS)”,其中ALL_FLAGS是将所有有效位设置为 1 的数字。其他位运算符可用于设置或测试单个位为需要。

请注意,此技术的上限为 32 个布尔值,然后您必须执行更多操作(例如,创建一个额外的整数字段来存储更多位)。

于 2012-08-26T18:15:43.267 回答
2

检查总和是否为 0 或等于布尔数:

((first + second + third) % 3 == 0)

这适用于任意数量的参数。

(但不要把这个答案当真,认真去做。)

于 2012-08-26T17:17:44.323 回答
1

在谈到谓词时,您通常可以通过使用两个变量进行量化操作来简化逻辑 - 全称量化(对所有人)和存在量化(存在)。

BOOL allValues = (value1 && value2 && value3);
BOOL anyValue = (value1 || value2 || value3);

if (allValues || !anyValue) {
   ... do something
}

如果您在数组中有很多布尔值,这也将起作用 - 您可以创建一个for评估这两个变量的循环。

于 2012-08-26T18:05:18.413 回答