【问题标题】:Shorthand for all bools YES or all bools NO?所有布尔值 YES 或所有布尔值 NO 的简写?
【发布时间】:2012-08-21 08:16:31
【问题描述】:

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

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

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

【问题讨论】:

  • 我很确定这是使用标准布尔逻辑运算符表达这一点的唯一方法。你想用某种特定的语言来做这件事吗?有些语言有这样的东西的速记方法
  • 如果所有元素都在一个不同的集合中,则谓词逻辑中存在。
  • 如果这让您感到困扰,请为它编写自己的函数(或宏)!

标签: objective-c math boolean logic


【解决方案1】:

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

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

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

【讨论】:

  • 但请注意:BOOL 不幸的是 signed char 的 typedef。
  • @Justin 你觉得检查(!first==!second && !second==!third)怎么样?
  • @Howard 是的,在引入最小句法噪音的同时可以正常工作。
  • @NikolaiRuhe 很好的链接答案 +1。我也尽可能使用bool
【解决方案2】:

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

例如,而不是:

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 个布尔值,然后您必须执行更多操作(例如,创建一个额外的整数字段来存储更多位)。

【讨论】:

  • 有趣的技术..我不是很熟悉你用枚举部分做什么..所以一个 int 有...32位?并且通过做 1
  • 一个整数通常至少为 32 位,尽管这因架构而异。 (使用&lt;stdint.h&gt;uint32_t 类型是确定变量至少是该大小的好方法。)可以通过多种方式定义枚举;我的目标是选择仅相差一位的值,因此 1、2、4,... 我发现使用移位运算符最清楚。同样,0x07 仅表示 7(二进制为 111;我的目标是将所有位设置为 1)。
  • 知道在哪里可以阅读更多关于您在说什么的信息吗?
  • 我不确定它是否有很好的参考价值...我在几年前通过示例了解了这个特殊的东西(因为 Apple 的 Mac OS API 倾向于使用这种方法)。不过,其中大部分只是 C 语言功能; &lt;&lt; 是左移运算符,匿名 enum 只是定义整数常量的几种方法之一,0x... 表示“十六进制数”,而在我的反例中,: 1 是 C 的位域语法示例(结果是编译器定义的)。
【解决方案3】:

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

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

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

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

【讨论】:

  • 在 BOOL 上使用它绝对是邪恶的。建议仅用于混淆您的代码。
  • @mohabitar 因为它隐藏了代码的含义。这就像在问“你们想要冰淇淋的总和与孩子总数的余数是否为零?”而不是“每个人都想要冰淇淋?”。我的意思是开玩笑。显然有些人还是觉得被冒犯了。
【解决方案4】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多