Comprobando los bits de la bandera java

Tengo un problema con los bits de la bandera. Tengo una variable int para mantener banderas. Primero, configuré algunas banderas para esa variable. Más tarde necesito verificar cuántas banderas se establecieron en esa variable. Pero no sé para hacerlo.

Para verificar si un valor de bit está establecido:

 int value = VALUE_TO_CHECK | OTHER_VALUE_TO_CHECK; if ((value & VALUE_TO_CHECK) == VALUE_TO_CHECK) { // do something--it was set } if ((value & OTHER_VALUE_TO_CHECK) == OTHER_VALUE_TO_CHECK) { // also set (if it gets in here, then it was defined in // value, but it does not guarantee that it was set with // OR without other values. To guarantee it's only this // value just use == without bitwise logic) } 

Es importante tener en cuenta que no debe tener un valor comprobado como 0 a menos que represente All o None (y no use la lógica bit a bit para comparar, simplemente use value == 0 ) porque cualquier value & 0 es SIEMPRE 0.

Además, considere usar un EnumSet lugar de campos de bits. Ver también Bloch, Ítem 32 .

Adición: Como un ejemplo concreto:

Los conjuntos Enum también proporcionan un reemplazo rico y seguro para los indicadores de bit tradicionales:

 EnumSet.of(Style.BOLD, Style.ITALIC); 

Tenga en cuenta en particular los métodos convenientes heredados de AbstractSet y AbstractCollection .

Si desea verificar si a tiene todos los bits de indicador en conjunto, puede verificarlo como sigue:

 (a & b) == b 

Estoy usando lo siguiente:

 public class BitFlags { public static boolean isFlagSet(byte value, byte flags) { return (flags & value) == value; } public static byte setFlag(byte value, byte flags) { return (byte) (flags | value); } public static byte unsetFlag(byte value, byte flags) { return (byte) (flags & ~value); } } 

Sin embargo, si no lo necesita “bajo nivel”, se recomienda utilizar EnumSets en EnumSets lugar para la seguridad añadida de tipo.