Il existe une variable qui contient certains indicateurs et je souhaite en supprimer un. Mais je ne sais pas comment le supprimer.
Voici comment j'ai mis le drapeau.
my.emask |= ENABLE_SHOOT;
Il existe une variable qui contient certains indicateurs et je souhaite en supprimer un. Mais je ne sais pas comment le supprimer.
Voici comment j'ai mis le drapeau.
my.emask |= ENABLE_SHOOT;
Réponses:
Réponse courte
Vous souhaitez effectuer une opération ET au niveau du bit sur la valeur actuelle avec une opération NON au niveau du bit de l' indicateur que vous souhaitez annuler . Un NOT au niveau du bit inverse chaque bit (c'est-à-dire 0 => 1, 1 => 0).
flags = flags & ~MASK;
ou flags &= ~MASK;
.
Longue réponse
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 un ET au niveau du bit avec PAS au niveau du bit de la valeur que vous souhaitez annuler.
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)
notification.sound ^= Notification.DEFAULT_SOUND;
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 int, la valeur utilisée dans l'expression 'and not' doit l'être également. En fait, on peut parfois s'en tirer en utilisant des types plus petits, mais il y a 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.
flags -= flags & MY_FLAG;
(ou ^=
si vous préférez).