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ć.

Author: Suragch, 2011-05-20

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.

 75
Author: pickypg,
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.

 30
Author: trashgod,
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
 17
Author: Ates Goral,
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.

 8
Author: BullyWiiPlaza,
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