Проверка флага битов Java - PullRequest
44 голосов
/ 20 мая 2011

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

Ответы [ 4 ]

78 голосов
/ 20 мая 2011

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

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

Важно отметить, что вы не должны иметь проверенное значение как 0, если оно не представляет Все или Нет (и не используйте побитовую логику для сравнения; просто используйте value == 0), потому что любой value & 0 равен ВСЕГДА 0.

33 голосов
/ 20 мая 2011

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

Приложение: в качестве конкретного примера :

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

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

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

17 голосов
/ 20 мая 2011

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

(a & b) == b
10 голосов
/ 14 ноября 2016

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

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 вместо добавленногоперк типа безопасности.

...