4

テクニックを学びながらflag、私はいくつかの問題に遭遇しました。ここでは、列挙型でC#を使用してこの例を示しています。

   [Flags]
    enum PermissionTypes : byte
    {
        None = 0x0,
        Read = 0x1,
        Write = 0x2,
        Modify = 0x4,
        Delete = 0x8,
        Create = 0x10,
        All = Read | Write | Modify | Delete | Create
    }

hasFlagプロパティを確認するには:

if((value & mask) == mask) {...}

しかし、「hasFlag」が「None」と「Read」の両方に適用された場合:

Denote x = Current_Permission_Setting,

x & PermissionTypes.None = always false
x & PermissionTypes.Read = always true IFF 

(続き')IFF x={ ODDバイト値}


質問:安全に使用できるフラグ値の完全なセットは何ですか?


参照: これが完全な例です。

4

2 に答える 2

6

@antlersoftがコメントで述べているように、実際にはビットフラグとして使用することはできませんNONE
残りのフラグは理にかなっています。フラグごとに1ビットを取得するには、2の累乗を使用する必要があります。

とにかく、「HAs READ and NONE」が設定されているかどうかをテストすることは意味がありません。これは、NONEはREADが設定されていないことを意味するためです。

Xの奇数値で説明する問題は、意味をなさないようです。ビット1が設定されている場合にのみ、値は奇数になります。フラグを一貫して使用している場合、ビット1はREADがtrueの場合にのみ設定されます。

于 2013-01-17T16:41:49.067 に答える
1

x & PermissionTypes.Read値の最後のビットxが設定されているかどうかをチェックします。これは、それ自体では、見つけたとおりに何も意味しません。プログラマーはそれをいくつかの方法で解釈できます。

  • xまたはを介してReadフラグが設定されています。x = Readx = x | Read
  • xは奇数です(または、2 ^ 1で割ると余り1が得られます)。これはx & 3、2^2で割ったときのリマインダーと同様です。

個々のビット値を表すフラグは、上に示したサンプルのように一般的に使用されます。各フラグに割り当てる意味を決定するのはプログラマー次第です。

フラグの使用法のもう1つのサンプル-「符号」ビットをチェックして、整数で渡されたものが負であるかどうかをチェックします。

[Flags]
enum StrangeFlags : uint {
    Negative = 0x80000000,
}

int x = -1;
var isNegative = ((StrangeFlags)x & StrangeFlags.Negative) != 0
于 2013-01-17T16:49:20.773 に答える