Wie kann ich ein Flag in C entfernen?

Lesezeit: 2 Minuten

Benutzeravatar von Aaron de Windt
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;

  • 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

Benutzeravatar von Dennis
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


1425050cookie-checkWie kann ich ein Flag in C entfernen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy