143 votes

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;
 

329voto

Dennis Points 9534

Réponse Courte

Vous voulez faire un bit à Bit ET de l'opération sur la valeur actuelle avec une not au niveau du Bit fonctionnement de l' indicateur que vous souhaitez annuler. Un not au niveau du Bit inverse tous les bits (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 de bits ET avec not au niveau du Bit de la valeur que vous souhaitez annuler.

value = value & ~ENABLE_SHOOT // 00000001

vous êtes en train de faire:

      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)

79voto

Ned Batchelder Points 128913
 my.emask &= ~(ENABLE_SHOOT);
 

pour effacer quelques drapeaux:

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

12voto

supercat Points 25534

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 se permettre d'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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X