2010-10-13 19 views
111

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; 
+5

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

Répondre

266

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) 
+0

@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

+1

@Dennis Je pensais que XOR travaillerait pour supprimer un drapeau déjà défini. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu

+3

Comment activer Walk? Depuis X | 0 == X – Unikorn

69
my.emask &= ~(ENABLE_SHOOT); 

pour effacer quelques drapeaux:

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

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.

+4

+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). –

+1

@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