Ungewöhnliche Syntax. Verständnisproblem



  • Guten Tag,

    ich weiß nicht so Recht ob das was ich fragen möchte nur Qt betrifft oder ob das eine Funktion/Schreibweise von C++ selber ist. Daher frage ich einfach mal.

    Unter Qt gibt es eine Möglichkeit Itemflags zu setzen und das ganze sieht so aus.

    item->setFlags(item->flags() &  ~Qt::ItemIsEditable);
    

    Meine Frage bezieht sich auf den Parameter der übergeben wird. Für mich sieht das nach einer Funktion aus und einem Destruktor, wenn ich mich nicht irre. Was genau soll das bedeuten? Statt dem & Zeichen gibt es auch andere Möglichkeiten, wie ^ zB. Kann mir jemand erklären was das genau macht? Nehme gerne auch Links entgegen.



  • Stichwort: Bitoperatoren



  • Vielen Dank. Das ganze sieht sehr interessant aus. Da das wohl systemnah ist wird es das wohl nicht bei alle Sprachen geben. Aber hab sowas glaube ich auch mal woanders gesehen. Glaube Javascript oder PHP.


  • Mod

    Fuel11 schrieb:

    Vielen Dank. Das ganze sieht sehr interessant aus. Da das wohl systemnah ist wird es das wohl nicht bei alle Sprachen geben.

    Eigentlich doch. Das ist eine ganz normale (und ziemlich nützliche) mathematische Operation, keine Siliziumtechnik. Es mag gut sein, dass ein Computerprozessor auch einen eigenen Befehl dafür hat, aber das Ergebnis ist ganz genau durch die Rechenvorschrift bestimmt, das kann auch jeder mit Papier und Stift nachvollziehen.



  • Zum Verständnis...

    Das Ergebnis einer solcher Bitoperation ist auch wieder eine Ganzzahl die ein Byte groß ist? So wie ich das verstanden habe, können so unterschiedliche Fälle in einer Variable dargestellt werden. In meinem obigen Beispiel soll quasi aus den Itemflags das Qt::ItemIsEditable entfernt werden, wegen der Negation. Eine ODER Verknüpfung würde ja in diesem Fall wenig Sinn machen, da ja ein Item editierbar ist oder nicht. Man könnte sagen, dass mehrere Items editierbar sind oder nicht, aber das müsste ja für jedes Item selbst festgelegt werden.

    Andere Frage...

    Wenn ich nun als Ergebnis eine neue Ganzzahl habe, wie verarbeite ich sie weiter? Zum Beispiel auch wieder mit Fallunterscheidung wie if oder switch?


  • Mod

    Es ist wieder eine Ganzzahl, ja. Was sonst? Jedoch sind in C++ (und anderen, ähnlichen Sprachen) alle Ergebnisse von Rechenoperationen mit Ganzzahlen immer mindestens vom Typ int oder größer.

    Fuel11 schrieb:

    Wenn ich nun als Ergebnis eine neue Ganzzahl habe, wie verarbeite ich sie weiter? Zum Beispiel auch wieder mit Fallunterscheidung wie if oder switch?

    Indem du weitere dieser Bitoperatoren darauf anwendest. Die Idee ist recht einfach: Jedes Bit in der Zahl stellt dar, ob ein bestimmtes Flag 'Ja' oder 'Nein' ist. Mit den Bitoperatoren & , | , und ^ kann man gezielt einzelne Bits manipulieren oder abfragen, indem man den Wert der Zahl mit einer 'Maske' verknüpft. Eine Maske ist dabei einfach eine andere Zahl, bei der man gezielt bestimmte Bits gesetzt oder nicht gesetzt hat, oft mit Hilfe der Verschiebeoperatoren << und >> .



  • Hört sich nicht schlecht an, ein wenig kompliziert, aber dafür sehr gerissen. Wo findet denn sowas noch Anwendung? Hab bisher nur Hardwarenahe Programmierung gelesen.



  • Wird häufig so verwendet, dass man verschiedene Werte definiert, bei denen genau ein Bit gestzt ist. Dann kann man praktisch in ein Byte 8 bools packen (jedes bit 0 oder 1).

    enum Flags {
        Flag1 = 1 << 0,  // = 1
        Flag2 = 1 << 1,  // = 2
        Flag3 = 1 << 2,  // = 4
    
        CombinedFlag = Flag1 | Flag2
    };
    
    void do_something(Flags flags)
    {
        if (flags & Flag1)
            // Flag1 ist gesetzt
        flags |= Flag2;  // Flag2 setzten
        flags &= ~Flag3;  // Flag3 ausschalten
    
        if (flags & CombinedFlag)  // != 0, falls Flag1 und/oder Flag2 gesetzt sind
            flags ^= Flag3;  // toggle Flag3
    }
    

    d.h. folgende Zeile

    item->setFlags(item->flags() &  ~Qt::ItemIsEditable);
    

    Sorgt dafür, dass Qt::ItemIsEditable nicht gesetzt ist, d.h. item kann nicht editiert werden. Alle anderen Flags bleiben unberührt.


Anmelden zum Antworten