У меня проблема с битами флага.
У меня есть переменная int
для хранения флагов. Сначала я устанавливаю некоторые флаги для этой переменной. Позже мне нужно проверить, сколько флагов было установлено в этой переменной. Но я не знаю, как это сделать.
Проверка флагов бит java
Ответ 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
вместо добавленного перка типа безопасность.