【问题标题】:Objective C: way to check for enabled flags目标 C:检查启用标志的方法
【发布时间】:2011-09-26 13:24:22
【问题描述】:

我正在使用 bitflag 来启用/禁用我的代码中的某些功能。我有以下枚举。

typedef enum function {
    function1 = 1 << 0,
    function2 = 1 << 1,
    function3 = 1 << 2,
    function4 = 1 << 3
};

我知道我需要使用以下代码来检查已启用的标志。

if((flags & function1) == function1)
{
    // do some action
}

在我的枚举中,标志的数量很大,要检查每个标志,我需要进行那么多“if”条件检查。有什么方法可以最小化所需的 if 语句的数量?我是目标 C 的新手,并希望在目标 C 中实现它。提前致谢。

【问题讨论】:

  • “大”是什么意思? 16? 256? 4096?对于 256 或更少,您可以使用带有函数指针的表,但我会使用普通索引 (0, 1, 2, 3, ...) 而不是位值。
  • 具体到 32 左右。我需要检查每个标志并采取适当的措施。我有一个检查每个标志的函数。我从无法控制的服务器接收位值。所以我必须移动位值。
  • 然后做一个这样的for循环: for (i = 0, bit = 1; i
  • 是的,这很棒。它应该工作。我认为为每个标志调用函数会增加一些性能开销,但很高兴知道这种替代方法。你应该在答案中发布这个。我不能接受评论作为答案。 :) 无论如何谢谢。

标签: objective-c enums


【解决方案1】:

是的,通过位或组合标志:

if (flags & (function1 | function2 | function3 | function4))
{
  // any of the flags has been set
}

此外,要检查您不需要的特定标志,== function1flags &amp; function1 就足够了,因为它将评估为零或function1

【讨论】:

  • 是的。这是正确的。但是我需要分别检查每个标志,并寻找一种方法来最小化 if 的数量。例如实现它,以便我能够使用 switch case。
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多