9

enumでマークされている場合[Flags]、.NET でこの型の値をテストして、単一の値のみが含まれているかどうかを確認する方法はありますか? ビットカウントを使用して必要な結果を得ることができますが、可能であれば組み込み関数を使用したいと考えています。

enum値を動的にループするとEnum.GetValues()、組み合わせフラグも返されます。次の例でその関数を呼び出すと、enum4 つの値が返されます。ただし、内部アルゴリズムに値の組み合わせを含めたくありません。には多くの値が含まれる可能性があり、値が変更された場合は追加のメンテナンスが必要になるため、個々のenum値の等価性をテストすることはできません。enumenum

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}



関連: StackOverflow: 組み合わせフラグの Enum.IsDefined

4

3 に答える 3

20

それをキャストして、 Bit Twiddling Hacksintのテクニックを使用して、2 の累乗かどうかを確認できます。

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;
于 2009-11-02T16:04:29.423 に答える
0

と の組み合わせを使用してIsDefined、2 の累乗をチェックできます。

于 2009-11-02T16:04:43.290 に答える
-1

Enum.GetValues を実行して、2 のべき乗 (2 で割り切れる剰余なし) のアイテムのみをカウントできます。

于 2009-11-02T16:05:16.590 に答える