2009-11-02 3 views
6

enum[Flags]と表示されている場合、この型の値をテストして単一の値しか含まないかどうかを調べる方法はありますか?私はビットカウントを使用したい結果を得ることができますが、可能であれば組み込み関数を使用したいと思います。単一値の[Flags]列挙型値のテスト

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

[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 on combined flags

答えて

14

あなたはintにキャストし、それが2の累乗だかどうかを確認するためにBit Twiddling Hacksから技術を使用することができます。

int v = (int)enumValue; 
return v != 0 && (v & (v - 1)) == 0; 
+0

+1。間違いなく最も透明な技術ではありませんが、間違いなく最も簡単です。 –

0

あなたはIsDefinedの組み合わせを使用し、2

+0

私が書いた例では、 'IsDefined'は常に' true'と評価されます。 –

-1

の権限をチェックすることができます可能性がありますがEnum.GetValuesなし残り2で2(割り切れるのパワーある項目のみをカウント)。