2011-09-29 10 views
17

Ciao Ho bisogno di rimuovere un flag in Java. Ho le seguenti costanti:Come rimuovere un flag in 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; 

Voglio rimuovere, ad esempio OPTION_E dalle opzioni predefinite. Perché il seguente codice non è corretto?

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

Cosa dice la JVM? Non farlo funzionare più velocemente di aspettare che una risposta torni da SO? Potresti averlo fatto tre volte ormai. – duffymo

risposta

36

|= Esegue un bit a bit o, quindi sei efficacemente "aggiungendo" tutte le bandiere diverse da OPTION_E. Si vuole &= (bit a bit e) per dire che si desidera conservare tutte le bandiere diverso OPTION_E:

result &= ~OPTION_E; 

Tuttavia, un approccio migliore sarebbe quello di utilizzare le enumerazioni e EnumSet per cominciare:

EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C, 
            Option.D, Option.E); 
options.Remove(Option.E); 
+4

+1 per suggerire l'uso di EnumSet. –

+0

Mi ha elencato come downvoting questo. Penso che sia stato un errore, ed è stato troppo tempo fa, quindi ora non posso annullarlo! – Andy

+0

EnumSet è molto dettagliato rispetto alle operazioni bit a bit. Quali sono i vantaggi di EnumSet che ti fanno credere che sia un approccio migliore? – RestInPeace

8

È necessario scrivere

result &= ~OPTION_E; 

più lunga spiegazione:

E 'necessario pensare in bit:

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

Il OR sarà mai chiaro 1 bit, sarà al massimo impostato un po 'di più. AND d'altra parte cancellerà i bit.

5

si consiglia di utilizzare l'operatore and invece di or:

result &= ~OPTION_E; 

Un modo di pensare a questo proposito è che |=set bit mentre &=cancella bit:

result |= 1; // set the least-significant bit 
result &= ~1; // clear the least-significant bit 
Problemi correlati