Es gibt eine Variable, die einige Flags enthält, und ich möchte eines davon entfernen. Aber ich weiß nicht, wie ich es entfernen soll.
So setze ich die Flagge.
my.emask |= ENABLE_SHOOT;
Es gibt eine Variable, die einige Flags enthält, und ich möchte eines davon entfernen. Aber ich weiß nicht, wie ich es entfernen soll.
So setze ich die Flagge.
my.emask |= ENABLE_SHOOT;
Antworten:
Kurze Antwort
Sie möchten eine bitweise UND- Operation für den aktuellen Wert mit einer bitweisen NICHT- Operation des Flags ausführen, das Sie deaktivieren möchten . Ein bitweises NICHT invertiert jedes Bit (dh 0 => 1, 1 => 0).
flags = flags & ~MASK;
oder flags &= ~MASK;
.
Lange Antwort
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
Wenn Sie ein bitweises UND mit bitweisem NICHT des Wertes ausführen, den Sie deaktivieren möchten.
value = value & ~ENABLE_SHOOT // 00000001
Sie tun tatsächlich:
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);
um ein paar Flaggen zu löschen:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Es ist wichtig zu beachten, dass, wenn die zu manipulierende Variable größer als ein int ist, auch der im Ausdruck 'und nicht' verwendete Wert sein muss. Eigentlich kann man manchmal mit kleineren Typen davonkommen, aber es gibt genug seltsame Fälle, in denen es wahrscheinlich am besten ist, Typensuffixe zu verwenden, um sicherzustellen, dass die Konstanten groß genug sind.
flags -= flags & MY_FLAG;
(oder ^=
wenn Sie es vorziehen).