Objective c 所有布尔值的速记是或否?
在我的代码中,我经常需要检查x个布尔值的状态是全部为真还是全部为假。因此,我: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 作为一个懒惰的程序员,我想知道这种查询是否有数学上的速记,而不是每次都要把这整件事打出来?所有布尔值的速记同样是测试(成对)相等:
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"
};