web-dev-qa-db-fra.com

Comment puis-je supprimer un drapeau en C?

Il y a une variable qui contient des drapeaux et je veux en supprimer un. Mais je ne sais pas comment l'enlever.

Voici comment je mets le drapeau.

my.emask |= ENABLE_SHOOT;
139
Aaron de Windt

Réponse courte

Vous voulez effectuer une opération bit à bit ET sur la valeur actuelle avec une opération bit à bit PAS de l'indicateur que vous souhaitez désactiver . Un bit à bit PAS inverse chaque bit (c'est-à-dire 0 => 1, 1 => 0).

flags = flags & ~MASK; ou flags &= ~MASK;.

Réponse longue

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

Lorsque vous effectuez une opération bit à bit ET avec bit à bit NON de la valeur que vous souhaitez désactiver.

value = value & ~ENABLE_SHOOT // 00000001

vous faites réellement:

      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)
318
Dennis
my.emask &= ~(ENABLE_SHOOT);

pour effacer quelques drapeaux:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
77
Ned Batchelder

Il est important de noter que si la variable manipulée est plus grande qu'un entier, la valeur utilisée dans l'expression 'et non' doit l'être également. En fait, on peut parfois utiliser des types plus petits, mais il existe suffisamment de cas étranges pour qu'il soit probablement préférable d'utiliser des suffixes de type pour s'assurer que les constantes sont suffisamment grandes.

12
supercat