microprocesador - Comprobando los bits de bandera java
microprocesador 8086 pdf (4)
Tengo un problema con los bits de bandera. Tengo una variable int
para mantener banderas. Primero pongo unas banderas a esa variable. Más tarde necesito verificar cuántas banderas se establecieron en esa variable. Pero no sé hacerlo.
Además, considere usar un EnumSet
lugar de campos de bits. Véase también Bloch, artículo 32 .
Anexo: Como example concreto:
Los conjuntos de enumeración también proporcionan un reemplazo rico y seguro para las marcas de bits tradicionales:
EnumSet.of(Style.BOLD, Style.ITALIC);
Tenga en cuenta en particular los métodos convenientes heredados de AbstractSet
y AbstractCollection
.
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 de "bajo nivel", se recomienda utilizar EnumSets
lugar de la ventaja añadida de seguridad de tipo.
Para verificar si se establece un valor de bit:
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 marcado como 0 a menos que represente Todo o Ninguno (y no use la lógica a nivel de bits para comparar; simplemente use el value == 0
) porque cualquier value & 0
es SIEMPRE 0.
Si desea verificar si a
tiene todos los bits de bandera en b
establecidos, puede verificarlo como:
(a & b) == b