Привет, мне нужно удалить флаг в Java. У меня есть следующие константы:
public final static int OPTION_A = 0x0001;
public final static int OPTION_B = 0x0002;
public final static int OPTION_C = 0x0004;
public final static int OPTION_D = 0x0008;
public final static int OPTION_E = 0x0010;
public final static int DEFAULT_OPTIONS =
OPTION_A | OPTION_B | OPTION_C | OPTION_D | OPTION_E;
Я хочу удалить, например, OPTION_E из параметров по умолчанию. Почему следующий код неверен?
// remove option E from defaul options:
int result = DEFATUL_OPTIONS;
result |= ~OPTION_E;
|=
выполняет побитовое или , так что вы фактически «добавляете» все флаги, кроме OPTION_E
. Вы хотите, чтобы &=
(побитовые и ) сказали, что хотите сохранить все флаги, кроме OPTION_E
:
result &= ~OPTION_E;
Однако, лучший подход будет использовать перечисления и EnumSet
, чтобы начать с:
EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C,
Option.D, Option.E);
options.remove(Option.E);
Вы должны использовать оператор and
вместо or
:
result &= ~OPTION_E;
Один способ думать об этом состоит в том, что |=
устанавливает бит, тогда как &=
очищает бит:
result |= 1; // set the least-significant bit
result &= ~1; // clear the least-significant bit