Bitmasken

Dieses Thema im Forum "C/C++" wurde erstellt von tr0nix, 17.10.2003.

  1. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Hallo zusammen

    Ich will fuer ein kleines SDL-Projekt transparenz und Alpha benutzen. Dabei muss ich ein 4-Byte-Integer haben (Uint32 gibt es von SDL gestellt).

    Jetzt habe ich ein kleines Problem. Und zwar sind in dem Uint32 die ersten 3 bytes fuer die Farben (RGB) und der letzte Value fuer den Alpha-Wert.

    Wie kann ich jetzt aus dem 4-Byte-Integer die Werte der einzelnen Farben und des Alpha-Wertes rauskriegen (bitshifting? bitmask?)? Die Funktion welche SDL benutzt um dies auf ein Surface abzubilden will die Farben naemlich einzeln zugeteilt haben.
    Ist eigentlich etwas simples, aber ich bin mit den Bitmasks und so noch nicht sehr fest.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    Ok, wenn ich mich recht erinnere geht das so:

    Beispiel eines 4Byte ints...
    10101010 11111111 00000000 0101010101

    Nun wollen wir den ersten Wert gerne haben, also shiften wir das ganze um 3 bytes = 24 bits nach rechts.
    Also:
    Code:
    var >= 24;
    Soweit so einfach... wenn wir jetzt einen in der Mitte bzw. Hinten haben wollen schieben wir einfach den Rest beiseite.
    Beispiel: 3. Byte
    Code:
    var <= 16;
    var >= 24;
    Keine Garantie, dass das stimmt, einfach nur mal so hingeschrieben ;)
     
  4. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Ja diese Idee hatte ich auch schon, fand sie aber etwas sehr umstaendlich!
    Eigentlich koennte man das ganze ja mit XOR verknuepfen:
    0xABCDABCD ^ 0xFF00FFFF = 0x00CD0000

    Jetzt muesste man das ganze nur noch nach rechts shiften:
    0x00CD0000 >> 16 = 0x000000CD

    Also zaehlen wir 1&1 zusammen:
    (0xABCDABCD ^ 0xFF00FFFF) >> 16 = 0x000000CD

    Ich kann meine "Theorie" leider gerade nicht testen (Freundin hier, boese Augen beobachten mich beim schreiben ;)) aber so sollte es doch gehen?
     
  5. #4 Malshun, 18.10.2003
    Malshun

    Malshun Jungspund

    Dabei seit:
    15.09.2003
    Beiträge:
    21
    Zustimmungen:
    0
    > man SDL_GetRGBA
    -----
    void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a);
    -----

    mfg,
    malshun
     
  6. hoza

    hoza Jungspund

    Dabei seit:
    16.08.2003
    Beiträge:
    10
    Zustimmungen:
    0
    Mit xor wirds nicht klappen aber versuch doch mal den & (bitweises und) operator:
    0x ab cd ef 12 &
    0x 00 FF 00 00 =
    0x 00 cd 00 00

    Und das dann mit >> verschieben.
     
  7. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Ich brauche den Wert in Uint32 weil ich es so im Struct abspeichern will. Ausserdem was nuetzt mir diese Funktion wenn vom User (bzw. schlussendlich Configdatei) die Farbe fuer die Transparenz bestimmt werden soll? Mit GetRGBA krieg ich nur die Farbe eines Pixels, aber das bringt mir nichts.


    hoza:
    Stimmt danke! Ich verwechsle dieses Zeugs immer ;)

    Hier zum nachvollziehen fuer Interessierte:
    Code:
    #include <stdio.h>
    
    int main(void)
    {
            int wert = 0x10BB,
                bitmaske = 0xFF00,
                resultat = 0;
    
            resultat = (bitmaske & wert) >> 8;
    
            printf("%i ist das Resultat\n", resultat);
    }
    
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Bitmasken