[C/C++] Bitoperation | , warum zur Initialisierung?



  • @Marcus naja eigentlich mit AND und bitweiser Invertierung (~) (o;

    -junix



  • Was sagt Dir der Ausdruck "stark vereinfacht"? 😮



  • dassnur die Hälfte der informationen enthalten ist? (o;

    -junix



  • HAR schrieb:

    Hi,
    warum benutzen viele Programmierer/Designer die Bitoperation | zur Kombinierung der Initialisierung ihrer Apis oder sonstwertiger Schnittstellen?
    Beispiel (SDL):

    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1)
    // ...
    

    Wo liegen hier denn die Vorteile? Ist die Auswertung einfacher? Wäre ein & nicht klüger?

    Grundlegendes Verständnisproblem:

    Du sagst der SDL ja nit einfach "Hey, mach' mal Init Video UND Init Audio"...

    Sondern das sind sogenannte Flags (Signalfähnchen), prinzipiell einzelne Bits, die entweder gesetzt oder nicht gesetzt werden können.

    Init Video
    wurde in der SDL Header z.B. mit 0x00000001
    eingestellt.
    Init Audio mit 0x00010000

    Rest wie Marc++us es schon erklärt hat.

    Man kann den Kram (natürlich) auch mit Dezimalzahlen besetzen:

    #define SDL_INIT_VIDEO 1
    #define SDL_INIT_AUDIO 2
    #define SDL_INIT_DICKBUMMBUMM 4

    Soa, und jetzt überleg mal, warum man nicht '3', '5', etc. nehmen kann...!! :p



  • HAR schrieb:

    Wo liegen hier denn die Vorteile?

    du musst dir keine Funktion schreiben mit Parametern fuer jede einzelne Funktion und kannst so a) leichter die Falgs erweitern und bleibst Binaer kompatibel b) hast nen schoen kleinen/uebersichtlichen Funktionskopf und c) sparst Speicher und den Aufwand den die Uebergabe der Parameter brauchen wuerde



  • Sgt. Nukem schrieb:

    Soa, und jetzt überleg mal, warum man nicht '3', '5', etc. nehmen kann...!! :p

    Das stimmt so nicht ganz. Oft gibt es auch Geschichten wie

    enum {
      INIT_VIDEO = (1<<0),
      INIT_AUDIO = (1<<1),
      INIT_THE_FULL_MEDIA_SHOW = INIT_VIDEO | INIT_AUDIO
    };
    


  • finix schrieb:

    Sgt. Nukem schrieb:

    Soa, und jetzt überleg mal, warum man nicht '3', '5', etc. nehmen kann...!! :p

    Das stimmt so nicht ganz. Oft gibt es auch Geschichten wie

    enum {
      INIT_VIDEO = (1<<0),
      INIT_AUDIO = (1<<1),
      INIT_THE_FULL_MEDIA_SHOW = INIT_VIDEO | INIT_AUDIO
    };
    

    Und was soll mir das sagen!??



  • Wo's grad so schoen zum Thema passt:

    kennt jemand ein gutes Tutorial o. AE. zum Thema Bitshifting/Bitoperationen in C++ (oder von mir aus auch reines C, sollte ja nicht so stark der Unterschied sein)... hab bisher noch kein Buch gesehn in dem das erklaert wird... *g*, nicht mal im Stroustrup, den ich eigentlich als komplette Sprachreferenz betrachte (bin jetzt bei Seite 400irgendwas, und bisher nix davon gesehen 😉 )...

    P. S. ich brauch keine Erklaerung von Binaerzahlen, ich kann die lesen, ich kann damit rechnen, ich kann sie nur nicht... shiften 😃



  • Blue-Tiger schrieb:

    ich kann sie nur nicht... shiften 😃

    x << y;

    Das verschiebt die Bits in 'x' um 'y' Bits nach links und gibt den Wert zurück.



  • Und was soll mir das sagen!??

    das 1 oder 2 3 ist und deshalb Zahlen, wie 3 doch verwendet werden.



  • Helium schrieb:

    Und was soll mir das sagen!??

    das 1 oder 2 3 ist und deshalb Zahlen, wie 3 doch verwendet werden.

    Ja klar, aber eben nicht für VERSCHIEDENE Flags...

    Ich kann nicht INIT_VIDEO 3 machen und INIT_AUDIO 1 und diese dann GETRENNT setzen...



  • Natürlich. Ich wollte nur erklären, was gemeint war. Was finix gesagt hat war pedantisch, aber prinzipell hat er recht.



  • DrGreenthumb schrieb:

    Blue-Tiger schrieb:

    ich kann sie nur nicht... shiften 😃

    x << y;

    Das verschiebt die Bits in 'x' um 'y' Bits nach links und gibt den Wert zurück.

    d.h. aus einem

    int i = 0x00000010;

    wuerde durch ein

    i << 3;

    ein

    0x00010000

    😕

    Shiftet >> dann nach rechts, oder?

    und was, wenn ich nur ein einziges Bit setzen/veraendern will?



  • Blue-Tiger schrieb:

    d.h. aus einem

    int i = 0x00000010;

    wuerde durch ein

    i << 3;

    ein

    0x00010000

    😕

    Ja, wobei die Schreibweise jetzt nicht ganz richtig ist. Mit 0x fangen in C Hexzahlen an.

    und was, wenn ich nur ein einziges Bit setzen/veraendern will?

    Dann brauchst du erstmal eine Bitmaske, wo nur das entsprechende Bit gesetzt ist.
    Nimm an du willst das 3. Bit setzen, dann nimmst du als Maske 1 << 2, weil 1 = 00000001 um 2 Bits verschoben ergibt 00000100.
    Willst du jetzt das dritte Bit in 'x' setzen, machst du

    x = x ODER bitmaske.

    In C:

    x = x | (1 << 2);
    

    Zum löschen dann UND statt oder. Siehe Post von Marc++us.
    Wobei du zum löschen die Bitmaske erst invertieren musst, sonst löscht du alle Bits ausser den einen.


Anmelden zum Antworten