Il existe une variable qui contient des drapeaux et je souhaite en supprimer un. Mais je ne sais pas comment l'enlever.Comment puis-je supprimer un drapeau en C?
Voici comment je définis le drapeau.
my.emask |= ENABLE_SHOOT;
Il existe une variable qui contient des drapeaux et je souhaite en supprimer un. Mais je ne sais pas comment l'enlever.Comment puis-je supprimer un drapeau en C?
Voici comment je définis le drapeau.
my.emask |= ENABLE_SHOOT;
Réponse courte
Vous voulez faire une sur la valeur actuelle opération Bitwise AND avec une opération Bitwise NOT du drapeau vous voulez mettre à. Un bit inverse 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 de bits et avec Bitwise non de la valeur que vous voulez unset.
value = value & ~ENABLE_SHOOT // 00000001
vous 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)
@Aaron: Je suis content que cela ait aidé. J'ai d'abord eu du mal à comprendre les opérations au niveau du bit * jusqu'à ce que * quelqu'un ait pris 10 minutes pour l'expliquer sur le papier. – Dennis
@Dennis Je pensais que XOR travaillerait pour supprimer un drapeau déjà défini. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu
Comment activer Walk? Depuis X | 0 == X – Unikorn
my.emask &= ~(ENABLE_SHOOT);
pour effacer quelques drapeaux:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Il est important de noter que si l'être variable manipulée est plus grand qu'un int, la valeur utilisée dans le « et non » expression doit être aussi bien. En fait, on peut parfois s'en tirer en utilisant des types plus petits, mais il y a assez de cas bizarres qu'il est probablement préférable d'utiliser des suffixes de type pour s'assurer que les constantes sont assez grandes.
+1 pour attraper le cas de coin non-évident. Une façon de l'éviter est d'utiliser à la place 'flags - = flags & MY_FLAG;' (ou '^ =' si vous préférez). –
@R .. J'aurais utilisé '^ =', sauf qu'il va basculer les bits et parfois vous ne savez pas lequel des nombreux drapeaux sont définis. Si je veux être sûr que les deux bits les plus à droite sont zéro, my.emask: '0 1 0 1' entrée : '0 0 1 1' avec: '^ =' '0 1 1 0' avec: '& ~' '0 1 0 0' – Hector
Vous pouvez trouver les réponses à la question SO ["Comment définir, effacer et basculer un seul bit en C"] (http://stackoverflow.com/questions/47981/how-do-you-set- clear-and-toggle-a-single-bit-in-c) utile. – schot