ejemplo - Cómo eliminar una bandera en Java
banderas en java (3)
Hola necesito quitar una bandera en Java. Tengo las siguientes constantes:
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;
Quiero eliminar, por ejemplo, OPTION_E de las opciones predeterminadas. ¿Por qué no es correcto el siguiente código?
// remove option E from defaul options:
int result = DEFATUL_OPTIONS;
result |= ~OPTION_E;
Debe utilizar el operador and
lugar de or
:
result &= ~OPTION_E;
Una forma de pensarlo es que |=
establece bits mientras que &=
borra bits:
result |= 1; // set the least-significant bit
result &= ~1; // clear the least-significant bit
Debes escribir
result &= ~OPTION_E;
Explicación más larga:
Debes pensar en bits:
~OPTION_E // 0x0010 -> 0xFFEF
DEFATUL_OPTIONS // -> 0x001F
0xFFEF | 0x001F // -> 0xFFFF
0XFFEF & 0x001F // -> 0x000F
El OR
nunca borrará 1
bits, como máximo se establecerá un poco más. AND
por otro lado se borrarán los bits.
|=
realiza un bit a bit o , por lo que efectivamente está "agregando" todas las banderas que no sean OPTION_E
. Desea que &=
(a nivel de bit y ) diga que desea conservar todas las banderas que no sean OPTION_E
:
result &= ~OPTION_E;
Sin embargo, un mejor enfoque sería utilizar enums y EnumSet
para comenzar con:
EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C,
Option.D, Option.E);
options.remove(Option.E);