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;
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)
my.emask &= ~(ENABLE_SHOOT);
pour effacer quelques drapeaux:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
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.