Как я могу удалить флаг в C? - PullRequest
136 голосов
/ 13 октября 2010

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

Вот как я установил флаг.

my.emask |= ENABLE_SHOOT;

Ответы [ 3 ]

313 голосов
/ 13 октября 2010

Короткий ответ

Вы хотите выполнить операцию Битовая И с текущим значением с помощью операции Битовая НЕ * операции флаг, который вы хотите сбросить .Битовое НЕ инвертирует каждый бит (то есть 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)
75 голосов
/ 13 октября 2010
my.emask &= ~(ENABLE_SHOOT);

, чтобы снять несколько флагов:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
11 голосов
/ 16 октября 2010

Важно отметить, что если манипулируемая переменная больше, чем int, значение, используемое в выражении «а не», также должно быть. На самом деле, иногда можно избежать использования меньших типов, но есть достаточно странных случаев, когда, вероятно, лучше использовать суффиксы типов, чтобы убедиться, что константы достаточно велики.

...