programacion ejemplo banderas java flags

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);