0

解決できないように見えるビット単位の列挙型に関する質問があります。次の例のように、ビット単位の列挙型で表されるフラグがいくつかあります。

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

上記の例ではすべて問題ありません。私の調査とstackoverflowのさまざまな役立つ投稿(たとえばこれ)に基づいて、上記の例を使用すると、基本的に32のオプション(または必要に応じてシフト)が与えられ、各オプションは32の1ビットを表すと結論付けました。 -ビットシリーズのオプション。基本的には、まで行くことができることを教えてくれます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

ヒープ割り当てのみがOKの場合は、いつでもこれをクラスとしてまとめることができます。

于 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 に答える