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;
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;
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)
@ 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
@Dennis Pensavo che XOR avrebbe funzionato per rimuovere una bandiera già impostata. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu
Come abilitare Walk? Da quando X | 0 == X – Unikorn
my.emask &= ~(ENABLE_SHOOT);
per cancellare un paio di bandiere:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
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.
+1 per prendere la cassa dell'angolo non invenduta. Un modo per evitarlo è usare 'flags - = flags e MY_FLAG;' (o '^ =' se preferisci). –
@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
È 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