所有bool的简写是或所有bool NO?

时间:2012-08-26 16:37:59

标签: objective-c math boolean logic

通常在我的代码中,我需要检查x个bool的状态是否为真,或者所有bool都是false。所以我这样做:

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

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

4 个答案:

答案 0 :(得分:5)

所有bool相同的简写是测试(成对)平等:

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

当然,您可以将此扩展为任意数量的布尔值,并使用运算符连接N-1次等级检查。

答案 1 :(得分: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个布尔值(例如,创建一个额外的整数字段以存储更多位)。

答案 2 :(得分:2)

检查总和是否等于或等于bool的数量:

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

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

(但是不要认真对待这个答案并且真实地做。)

答案 3 :(得分:1)

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

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

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

如果数组中有很多布尔值,这也可以工作 - 您可以创建一个for周期来评估这两个变量。