2011-09-29 7 views
17

こんにちは、Javaでフラグを削除する必要があります。私は以下の定数を持っています:Javaでフラグを削除する方法

public final static int OPTION_A = 0x0001; 
public final static int OPTION_B = 0x0002; 
public final static int OPTION_C = 0x0004; 
public final static int OPTION_D = 0x0008; 
public final static int OPTION_E = 0x0010; 
public final static int DEFAULT_OPTIONS = 
     OPTION_A | OPTION_B | OPTION_C | OPTION_D | OPTION_E; 

デフォルトのオプションからOPTION_Eを削除したいと思います。次のコードが正しくないのはなぜですか?

// remove option E from defaul options: 
int result = DEFATUL_OPTIONS; 
result |= ~OPTION_E; 
+0

JVMはあなたに何を伝えますか? SOから戻ってくるのを待っているよりも速く走っていないでしょうか?あなたは今これを3回やり遂げることができました。 – duffymo

答えて

36

|=行い:&=ビットをクリアし、一方、それについて考えるために

result &= ~OPTION_E; 

一つの方法は、その|=セットビットであり、ビット単位でまたはです効果的に「OPTION_E以外のすべてのフラグを追加します。しかし、より良いアプローチをして起動する列挙型とEnumSetを使用することです

result &= ~OPTION_E; 

あなたは OPTION_E以外すべてのフラグを保持しますが したいとする&=(ビット単位を)したいです
EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C, 
            Option.D, Option.E); 
options.Remove(Option.E); 
+4

+1はEnumSetの使用を提案します。 –

+0

私にはこれをdownvotingとして記載されています。私はそれが間違いだったと思うし、それはずっと前だったので、今私はそれを取り消すことができません! – Andy

+0

EnumSetは、ビット単位の操作に比べて非常に冗長です。 EnumSetのメリットは、それがより良いアプローチだと信じさせることです。 – RestInPeace

8

あなたは

result &= ~OPTION_E; 

長い説明を記述する必要があります、それは高々設定します

~OPTION_E // 0x0010 -> 0xFFEF 
DEFATUL_OPTIONS //  -> 0x001F 
0xFFEF | 0x001F //  -> 0xFFFF 
0XFFEF & 0x001F //  -> 0x000F 

ORます決して明確1ビット:

あなたはビットで考えなければならないがもう少し。一方、 ANDはビットをクリアします。

5

かわりorand演算子を使用する必要があります。

result |= 1; // set the least-significant bit 
result &= ~1; // clear the least-significant bit 
関連する問題