通常在我的代码中,我需要检查 x 个布尔值的状态是否全部为真或所有布尔值都为假。所以我这样做:
BOOL first, second, third;
if((first && second && third) || (!first && !second && !third))
//do something
作为一个懒惰的程序员,我想知道这种查询是否有一些数学简写,而不是每次都必须输入整个内容?
通常在我的代码中,我需要检查 x 个布尔值的状态是否全部为真或所有布尔值都为假。所以我这样做:
BOOL first, second, third;
if((first && second && third) || (!first && !second && !third))
//do something
作为一个懒惰的程序员,我想知道这种查询是否有一些数学简写,而不是每次都必须输入整个内容?
所有布尔值相同的简写是测试(成对)相等性:
(first==second && second==third)
当然,您可以将其扩展为任意数量的布尔值,将N-1
相等检查与and运算符结合使用。
如果这是您经常需要的东西,那么您最好使用整数并单独读取位。
例如,而不是:
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 个布尔值,然后您必须执行更多操作(例如,创建一个额外的整数字段来存储更多位)。
检查总和是否为 0 或等于布尔数:
((first + second + third) % 3 == 0)
这适用于任意数量的参数。
(但不要把这个答案当真,认真去做。)
在谈到谓词时,您通常可以通过使用两个变量进行量化操作来简化逻辑 - 全称量化(对所有人)和存在量化(存在)。
BOOL allValues = (value1 && value2 && value3);
BOOL anyValue = (value1 || value2 || value3);
if (allValues || !anyValue) {
... do something
}
如果您在数组中有很多布尔值,这也将起作用 - 您可以创建一个for
评估这两个变量的循环。