2011-05-30 7 views
2

私は、次の列挙型を持っている:別の列挙型とともに列挙型フラグが立てられているかどうかをチェックする方法?

[Flags] 
public enum Permissions 
{ 
    None = 0x0000, 
    All = 0xFFFF 
} 

Noneまたは全てのいずれかが提起されていない場合は、他のフラグが上がってはなりません。
NoneまたはAllのいずれかが発生しているかどうかを確認するにはどうすればよいですか?

+6

あなたは 'Flags'属性を正しく使用していません。この属性は、ビットマスクとして実装されている列挙型を意味し、列挙型がビットマスクの場合は、 'None'が' 0'、 'All'が' 0xFFFF'となるため、この質問をする必要はありません。 – mquander

+0

http://stackoverflow.com/questions/8447/enum-flags-attribute –

+0

フラグが正しく使用されている場合、Noneはマスク0000 ... 0を持ち、Allはマスク1111 ... 1を持ちます。これは 'All 'はすべてのフラグセットに対応し、' None'をnoneフラグセットに対応させます。 –

答えて

6

フラグの列挙型では、Noneはゼロでなければならず、Allは累積ビット単位の合計でなければなりません。これは、その後、数学はかなり簡単です:ただし

多分あなたが好む場合 switchとして書か
if(value == Permissions.None || value == Permissions.All) {...} 

...

一般場合には、あなたは(に対する完全なフラグの試合のためにテストすることができます任意のビット数)を有する:

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

及び任意のオーバーラップ(すなわち、任意の共通のビットをテストする - 非ゼロである必要がwanted):

if((value & wanted) != 0) {...} 
+0

ありがとう!これは私にとって全く異質の概念ですが、言語の非常にクールな機能です。説明をありがとう。決してJavaで多くのAND'ingやOR'ing :) – anon58192932

0
if(value|Permissions.None)==Permissions.None; 

これにより、Permissions.Noneがチェックされます。残りは同じ方法で行うことができます。

関連する問題