0

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

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

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

4

2 回答 2

3

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

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

但是,如果您对引用调用语义没问题,您也可以使用 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

如果仅堆分配可以,您始终可以将其包装为一个类。

于 2012-06-20T19:36:29.610 回答
0

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

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

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;
于 2012-06-20T18:39:20.277 回答