Есть переменная, которая содержит некоторые флаги, и я хочу удалить один из них. Но я не знаю, как это удалить.
Вот как я установил флаг.
my.emask |= ENABLE_SHOOT;
Есть переменная, которая содержит некоторые флаги, и я хочу удалить один из них. Но я не знаю, как это удалить.
Вот как я установил флаг.
my.emask |= ENABLE_SHOOT;
Ответы:
Короткий ответ
Вы хотите выполнить побитовую операцию И для текущего значения с побитовой операцией НЕ для флага, который хотите сбросить . Побитовое НЕ инвертирует каждый бит (то есть 0 => 1, 1 => 0).
flags = flags & ~MASK;
или flags &= ~MASK;
.
Длинный ответ
ENABLE_WALK = 0 // 00000000
ENABLE_RUN = 1 // 00000001
ENABLE_SHOOT = 2 // 00000010
ENABLE_SHOOTRUN = 3 // 00000011
value = ENABLE_RUN // 00000001
value |= ENABLE_SHOOT // 00000011 or same as ENABLE_SHOOTRUN
Когда вы выполняете побитовое И с побитовым НЕ значение, которое вы хотите сбросить.
value = value & ~ENABLE_SHOOT // 00000001
вы на самом деле делаете:
0 0 0 0 0 0 1 1 (current value)
& 1 1 1 1 1 1 0 1 (~ENABLE_SHOOT)
---------------
0 0 0 0 0 0 0 1 (result)
notification.sound ^= Notification.DEFAULT_SOUND;
my.emask &= ~(ENABLE_SHOOT);
очистить несколько флагов:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Важно отметить, что если манипулируемая переменная больше, чем int, значение, используемое в выражении «а не», также должно быть. На самом деле, иногда можно избежать использования меньших типов, но есть достаточно странных случаев, когда, вероятно, лучше использовать суффиксы типов, чтобы убедиться, что константы достаточно велики.
flags -= flags & MY_FLAG;
(или, ^=
если хотите).