2011-09-29 14 views
17

Hola, necesito eliminar un indicador en Java. Tengo las siguientes constantes:Cómo eliminar un indicador en 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; 

Deseo eliminar, por ejemplo, OPTION_E de las opciones predeterminadas. ¿Por qué el siguiente código no es correcto?

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

¿Qué le dice la JVM? ¿No sería más rápido ejecutarlo que esperar que volviera una respuesta de SO? Podrías haber hecho esto tres veces hasta ahora. – duffymo

Respuesta

36

|= Realiza un bit a o, por lo que eres efectivamente "agregando" todas las banderas que no sean OPTION_E. ¿Quieres &= (bit a bit y) a decir que quiere conservan todas las banderas que no sean OPTION_E:

result &= ~OPTION_E; 

Sin embargo, un mejor enfoque sería utilizar enumeraciones y EnumSet que comienzan con:

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

+1 para sugerir el uso de EnumSet. –

+0

Me ha enumerado como downvoting esto. Creo que fue un error, y fue hace mucho tiempo, ¡así que ahora no puedo deshacerlo! – Andy

+0

EnumSet es muy detallado en comparación con operaciones bit a bit. ¿Cuáles son los beneficios de EnumSet que te hacen creer que es un mejor enfoque? – RestInPeace

8

Debe escribir explicación

result &= ~OPTION_E; 

más larga:

Usted debe pensar en bits:

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

nunca claras 1 trozos, será como máximo establecido El OR algo mas. AND por otro lado borrará los bits.

5

se debe utilizar el operador and en lugar de or:

result &= ~OPTION_E; 

Una forma de pensar en ello es que |=conjuntos trozos mientras que &=borra trozos:

result |= 1; // set the least-significant bit 
result &= ~1; // clear the least-significant bit 
Cuestiones relacionadas