Проверка флагов бит java

У меня проблема с битами флага. У меня есть переменная int для хранения флагов. Сначала я устанавливаю некоторые флаги для этой переменной. Позже мне нужно проверить, сколько флагов было установлено в этой переменной. Но я не знаю, как это сделать.

Ответ 1

Чтобы проверить, установлено ли значение бита:

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 only this
    //   value just use == without bitwise logic)
}

Важно отметить, что вы не должны иметь проверенное значение как 0, если оно не представляет All или None (и не использует побитовую логику для сравнения, просто используйте value == 0), потому что любой value & 0 является ALWAYS 0.

Ответ 2

Кроме того, рассмотрите возможность использования EnumSet вместо битовых полей. См. Также Блох, элемент 32.

Приложение: как конкретный пример:

Наборы Enum также предоставляют богатую замену типов для традиционных битовых флагов:

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

Обратите внимание, в частности, на удобные методы, унаследованные от AbstractSet и AbstractCollection.

Ответ 3

Если вы хотите проверить, есть ли a все бит флага в b, вы можете проверить его как:

(a & b) == b

Ответ 4

Я использую следующее:

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

Однако, если вам не нужно "низкоуровневое", рекомендуется использовать EnumSets вместо добавленного перка типа безопасность.