C'è una variabile che contiene alcune bandiere e voglio rimuoverne una. Ma non so come rimuoverlo.
Ecco come ho impostato la bandiera.
my.emask |= ENABLE_SHOOT;
C'è una variabile che contiene alcune bandiere e voglio rimuoverne una. Ma non so come rimuoverlo.
Ecco come ho impostato la bandiera.
my.emask |= ENABLE_SHOOT;
Risposte:
Risposta breve
Si desidera eseguire un'operazione AND bit a bit sul valore corrente con un'operazione Bit a bit NOT del flag che si desidera annullare . Un bit a bit NON inverte ogni bit (ovvero 0 => 1, 1 => 0).
flags = flags & ~MASK;
o flags &= ~MASK;
.
Risposta lunga
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 bit a bit E con bit a bit NOT del valore che si desidera annullare.
value = value & ~ENABLE_SHOOT // 00000001
stai 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)
notification.sound ^= Notification.DEFAULT_SOUND;
my.emask &= ~(ENABLE_SHOOT);
per cancellare alcune bandiere:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
È importante notare che se la variabile manipolata è più grande di un int, anche il valore usato nell'espressione 'e non' deve essere. In realtà, a volte si può cavarsela usando tipi più piccoli, ma ci sono casi abbastanza strani che probabilmente è meglio usare suffissi di tipo per assicurarsi che le costanti siano abbastanza grandi.
flags -= flags & MY_FLAG;
(o ^=
se preferisci).