Es gibt eine Variable, die einige Flags enthält, und ich möchte eines davon entfernen. Aber ich weiß nicht, wie ich es entfernen kann.
Hier ist, wie ich die Flagge gesetzt habe.
my.emask |= ENABLE_SHOOT;
Aaron de Windt
Es gibt eine Variable, die einige Flags enthält, und ich möchte eines davon entfernen. Aber ich weiß nicht, wie ich es entfernen kann.
Hier ist, wie ich die Flagge gesetzt habe.
my.emask |= ENABLE_SHOOT;
Dennis
Kurze Antwort
Du willst eine machen Bitweises UND Betrieb auf dem aktuellen Wert mit a Bitweise NICHT Betrieb der Flag, das Sie zurücksetzen 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 Werts ausführen, den Sie aufheben möchten.
value = value & ~ENABLE_SHOOT // 00000001
du machst eigentlich:
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: Ich bin froh, dass es geholfen hat. Ich hatte anfangs Probleme, bitweise Operationen zu verstehen bis um Jemand brauchte 10 Minuten, um es auf Papier zu erklären.
– Denis
14. Oktober 2010 um 1:08 Uhr
@Dennis Ich dachte, XOR würde funktionieren, um ein bereits gesetztes Flag zu entfernen. notification.sound ^= Notification.DEFAULT_SOUND;
– wie Judo
14. April 2014 um 9:56 Uhr
Wie aktivierst du Walk? Da X | 0 == X
– Unikorn
29. April 2014 um 16:36 Uhr
Wie @Unikorn betont, funktioniert ein Flag-Wert von Null nicht richtig, entweder wenn Sie versuchen, es mit ODER zu aktivieren oder wenn Sie versuchen, es mit UND auszuschalten.
– RenniePet
14. Dezember 2014 um 0:41 Uhr
Um Walk zu aktivieren, müssen Sie nur Run deaktivieren (wodurch Bit 1 auf 0 gesetzt bleibt). Stellen Sie sich die ENABLE_*-Flags nicht als Dezimalzahlen vor, sondern als Binärzahlen, entweder ein- oder ausgeschaltet. Du kannst es immer noch nicht ausdrücklich Gehen jedoch aktivieren oder deaktivieren.
– Jakob Degeling
5. August 2017 um 9:03 Uhr
my.emask &= ~(ENABLE_SHOOT);
um ein paar flags 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-Wert ist, der im „and not“-Ausdruck verwendete Wert ebenfalls gleich sein muss. Tatsächlich kann man manchmal mit kleineren Typen davonkommen, aber es gibt genug seltsame Fälle, in denen es wahrscheinlich am besten ist, Typsuffixe zu verwenden, um sicherzustellen, dass die Konstanten groß genug sind.
+1 für das Erfassen des nicht offensichtlichen Eckfalls. Eine Möglichkeit, dies zu vermeiden, besteht darin, stattdessen zu verwenden flags -= flags & MY_FLAG;
(oder ^=
wenn Sie es vorziehen).
– R.. GitHub HÖR AUF, EIS ZU HELFEN
16. Oktober 2010 um 7:52 Uhr
@R .. Ich hätte ‘^=’ verwendet, außer es schaltet die Bits um und manchmal wissen Sie vielleicht nicht, welche der vielen Flags gesetzt sind. Wenn ich sicherstellen möchte, dass die zwei Bits ganz rechts Null sind, zB my.emask: ‘0 1 0 1’ Eingabe: ‘0 0 1 1’ mit: ‘^=’ ‘0 1 1 0’ mit: ‘& ~ ‘ ‘0 1 0 0’
– Hektor
26. März 2015 um 17:18 Uhr
Möglicherweise finden Sie die Antworten auf die SO-Frage “Wie setzen, löschen und schalten Sie ein einzelnes Bit in C um” hilfreich.
– schott
13. Oktober 2010 um 6:28 Uhr