2010-10-13 20 views
111

C'è una variabile che contiene alcuni flag e voglio rimuoverne uno. Ma non so come rimuoverlo.Come posso rimuovere un flag in C?

Ecco come ho impostato la bandiera.

my.emask |= ENABLE_SHOOT; 
+5

È possibile trovare le risposte alla domanda SO ["Come si imposta, deselezionare e attivare un singolo bit in C"] (http://stackoverflow.com/questions/47981/how-do-you-set- clear-and-toggle-a-single-bit-in-c) utile. – schot

risposta

266

Risposta breve

Si vuole fare un'operazione Bitwise AND sul valore corrente con un Bitwise NOT funzionamento della bandiera vuoi disinserire. Un NOT bit a bit inverte ogni bit (cioè 0 => 1, 1 => 0).

flags = flags & ~MASK; o flags &= ~MASK;.

lungo risposta

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 

Quando si esegue un'AND bit per bit con NOT bit a bit del valore che si desidera disinserito.

value = value & ~ENABLE_SHOOT // 00000001 

si sta effettivamente facendo:

 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: Sono contento che sia stato d'aiuto. Inizialmente avevo difficoltà a capire le operazioni bit a bit * fino a quando * qualcuno impiegava 10 minuti per spiegarlo su carta. – Dennis

+1

@Dennis Pensavo che XOR avrebbe funzionato per rimuovere una bandiera già impostata. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu

+3

Come abilitare Walk? Da quando X | 0 == X – Unikorn

69
my.emask &= ~(ENABLE_SHOOT); 

per cancellare un paio di bandiere:

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

E 'importante notare che se l'essere variabile manipolata è più grande di un int, il valore utilizzato nella 'e non' espressione deve essere pure. In realtà, a volte è possibile fare a meno di usare tipi più piccoli, ma ci sono casi abbastanza strani che probabilmente è meglio usare i suffissi di tipo per assicurarsi che le costanti siano abbastanza grandi.

+4

+1 per prendere la cassa dell'angolo non invenduta. Un modo per evitarlo è usare 'flags - = flags e MY_FLAG;' (o '^ =' se preferisci). –

+1

@R .. Avrei usato '^ =' tranne che cambierà i bit e talvolta potresti non sapere quale dei molti flag sono impostati. Se voglio accertarmi che i due bit più a destra siano zero, ad es. , ad es. my.emask: '0 1 0 1' ingresso: '0 0 1 1' con: '^ =' '0 1 1 0' con: 'e ~' '0 1 0 0' – Hector

Problemi correlati