Подтвердить что ты не робот

Как удалить флаг в Java

Привет, мне нужно удалить флаг в 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;
4b9b3361

Ответ 1

|= выполняется побитово или, так что вы фактически "добавляете" все флаги, кроме 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);

Ответ 2

Вы должны написать

result &= ~OPTION_E;

Более подробное объяснение:

Вы должны думать в битах:

~OPTION_E    // 0x0010 -> 0xFFEF
DEFATUL_OPTIONS //     -> 0x001F
0xFFEF | 0x001F //     -> 0xFFFF
0XFFEF & 0x001F //     -> 0x000F

OR никогда не очистит бит 1, он будет больше установленным. AND, с другой стороны, очистит биты.

Ответ 3

Вместо or следует использовать оператор and:

result &= ~OPTION_E;

Один из способов подумать о том, что |= устанавливает биты, тогда как &= очищает бит:

result |= 1;  // set the least-significant bit
result &= ~1; // clear the least-significant bit