【问题标题】:Large number of bitwise enums大量的按位枚举
【发布时间】:2012-06-22 22:23:56
【问题描述】:

我有一个关于按位枚举的问题,我似乎无法解决。我有许多由按位枚举表示的标志,如下例所示:

enum
{
    EnumNone=0,
    EnumOne = 1<<0,
    EnumTwo = 1<<1,
    EnumThree = 1<<2,
    EnumFour = 1<<3
};
typedef NSUInteger MyEnum;

上面的例子一切都很好。根据我在 stackoverflow (this for example) 中的研究和各种有用的帖子,我得出的结论是,使用上面的示例,我基本上得到了 32 个选项(或者如果你愿意的话),每个选项代表 32 中的 1 位-bit系列选项,基本告诉我可以一路走到EnumThirtyTwo = 1 &lt;&lt; 31

我的问题是这样的:

假设我有超过 32 个(例如 75 个)标志来表示使用按位枚举。怎样才能最好地表现出来?

enum
{
    EnumNone=0,
    EnumOne = 1<<0,
    EnumTwo = 1<<1,
    EnumThree = 1<<2,
    EnumFour = 1<<3,
    ...
    ...
    EnumSeventyFive = 1<<75
};
typedef NSUInteger MyEnum;

将我的枚举类型的声明更改为:typedef long int MyEnum;typedef long MyEnum 是否很简单?

【问题讨论】:

  • 如果您需要超过 64 个标志,那么您将度过一段糟糕的时光。
  • 感谢@PaulR 您的意见。 +1 不让你回答:)。

标签: objective-c enums bit-manipulation


【解决方案1】:

您可以使用一些简单的宏/函数和包含足够大小的 char 数组的 struct - 为您提供 按值调用 语义,即就像真正的枚举一样。例如。类似于(直接输入答案):

typedef struct
{
    char bits[10]; // enough for 80 bits...
} SeventyFiveFlags;

typedef enum
{
   EnumOne = 0,
   ...
   EnumSeventyFive = 74
} SeventyFiveFlagNames;

NS_INLINE BOOL testFlag(SeventyFiveFlags flags, SeventyFiveFlagNames bit)
{
   return (flags.bits[bit >> 3] & (1 << (bit & 0x7))) != 0;
}

但是,如果您对 call-by-reference 语义没问题,您也可以使用 bitstring(3) 函数/宏。这些创建(堆或堆栈)任何长度的位串。使用您的枚举为位数提供符号名称而不是掩码,例如:

#include <bitstring.h>

typedef enum
{
   EnumOne = 0,
   ...
   EnumSeventyFive = 74,
   SeventyFiveFlagsSize = 75
} SeventyFiveFlagNames;

typedef bitstr_t *SeventyFiveFlags;

// local (stack) declaration & use
SeventyFiveFlags seventyFive;
bit_decl(seventyFive, SeventyFiveFlagsSize); // declare
bit_nclear(seventyFive, EnumOne, EnumSeventyFive); // set all false

if( bit_test(seventyFive, EnumFortyTwo) ) // test

如果仅堆分配没问题,您总是可以将其包装为一个类。

【讨论】:

    【解决方案2】:

    也许我在谈论一些无关紧要的事情。

    我认为枚举中有太多标志不是一个好习惯。拥有这么多的标志,必须有办法将它们分组,例如:

    enum
    {
        EnumNone=0,
        EnumOne = 1<<0,
        EnumTwo = 1<<1,
        EnumThree = 1<<2,
        EnumFour = 1<<3
    };
    typedef NSUInteger widthRelated;
    
    enum
    {
        EnumNone=0,
        EnumOne = 1<<0,
        EnumTwo = 1<<1,
        EnumThree = 1<<2,
        EnumFour = 1<<3
    };
    typedef NSUInteger heightRelated;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多