Sprawdzanie bitów flag java
Mam problem z bitami flag.
Mam zmienną int
do przechowywania FLAG. Najpierw ustawiłem kilka flag do tej zmiennej. Później muszę sprawdzić, ile FLAG zostało ustawionych w tej zmiennej. Ale nie wiem, jak to zrobić.
4 answers
Aby sprawdzić, czy wartość bitowa jest ustawiona:
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)
}
Ważne jest, aby pamiętać, że nie powinieneś mieć sprawdzonej wartości jako 0, chyba że reprezentuje ona wszystkie lub brak (i nie używaj logiki bitowej do porównywania; po prostu użyj value == 0
), ponieważ dowolna value & 0
jest zawsze równa 0.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-11 02:37:12
Również rozważ użycie EnumSet
zamiast pól bitowych. Zobacz też Bloch, poz. 32.
Dodatek: jako konkretny przykład :
Zestawy Enum zapewniają również bogaty, bezpieczny dla typów zamiennik tradycyjnych znaczników bitowych:
EnumSet.of(Style.BOLD, Style.ITALIC);
Zwróć uwagę w szczególności na wygodne metody dziedziczone z AbstractSet
i AbstractCollection
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-23 12:57:27
Jeśli chcesz sprawdzić, czy a
ma ustawione wszystkie bity znaczników w b
, możesz to sprawdzić jako:
(a & b) == b
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-17 12:27:14
Używam:
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);
}
}
Jednak, jeśli nie potrzebujesz go "niskiego poziomu", zaleca się użycie EnumSets
zamiast tego dla dodatkowego atutu bezpieczeństwa typu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-14 11:56:57