Objective c 所有布尔值的速记是或否?

Objective c 所有布尔值的速记是或否?,objective-c,math,boolean,logic,Objective C,Math,Boolean,Logic,在我的代码中,我经常需要检查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)

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

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

((first + second + third) % 3 == 0)
这适用于任意数量的参数


(但不要把这个答案当真。)

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


如果一个数组中有很多布尔值,这也会起作用-您可以创建一个
循环来计算这两个变量。

如果这是您经常需要的,那么最好使用整数并分别读取位

例如,而不是:

BOOL x; // not this
BOOL y; // not this
BOOL z; // 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"
};
enum{//执行此操作

FLAG_X=(1我很确定这是使用标准布尔逻辑运算符表示的唯一方法。你想在某种特定语言中实现这一点吗?有些语言有类似于谓词逻辑的速记方法,如果所有元素都在一个不同的集合中。如果这让你感到困扰,请编写自己的函数(或宏)对于它!但要注意:
BOOL
不幸是一个类型定义为
signed char
@Justin检查
(!first==!second&&!second==!third)你觉得怎么样
取而代之?请看@Howard yes,这在引入最小语法噪音的情况下效果很好。@NikolaiRuhe很棒的链接答案+1。我还尽可能使用
bool
。在BOOLs上使用它是绝对有害的。建议只会混淆你的代码。@mohabitar,因为它隐藏了你代码的含义。这就像问问题一样“想要冰淇淋的人和孩子总数之和的剩余部分等于零吗?”而不是“每个人都想要冰淇淋?”?“。我的意思是开玩笑。显然有些人仍然感到不快。有趣的技术..我对枚举部分的操作不太熟悉..所以一个int有…32位?通过执行1,一个整数通常至少是32位,尽管这因体系结构而异。(使用
和类型
uint32\u t
是确保变量至少达到该大小的好方法。)枚举可以用多种方式定义;我的目标是选择只相差一位的值,因此1、2、4……我发现使用移位运算符可以最清楚地做到这一点。类似地,
0x07
只是意味着
7
(二进制为
111
;我的目标是将所有位设置为1).你知道我在哪里可以读到更多关于你所说的内容吗?我不确定这是否是一个很好的参考资料…我几年前通过示例了解了这一点(因为苹果的Mac OS API倾向于使用这种方法)。不过,其中大部分只是C语言的功能;

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"
};