Bitmaskierung bei Bitshifting



  • Weshalb werden bei diesem Makro die einzelnen Bytes mit 0xff maskiert vor dem shift?

    #define D3DCOLOR_ARGB(a,r,g,b)   ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
    

    Und kann ich aus einer 32Bit Variable die 4 Komponenten so herauslesen, wenn sie als ARGB gespeichert sind?

    Color( unsigned int argb )
    {
    	unsigned char *p = reinterpret_cast< unsigned char* >( &argb );
    	Alpha = p[ 3 ];
    	Red   = p[ 2 ];
    	Green = p[ 1 ];
    	Blue  = p[ 0 ];
    }
    


  • C++er schrieb:

    Weshalb werden bei diesem Makro die einzelnen Bytes mit 0xff maskiert vor dem shift?

    Weil Makros im Gegensatz zu Funktionen dumm sind und keine Typprüfung erlauben. Wer hindert dich daran, bei diesem Makro Werte zu benutzen, die über 255 hinausgehen?

    Und kann ich aus einer 32Bit Variable die 4 Komponenten so herauslesen, wenn sie als ARGB gespeichert sind?

    Warum probierst du es nicht aus? Auf einer Little-Endian-Plattform sollte das aber funktionieren.



  • Warum kehrst du nicht einfach die Arbeit des obigen Makros um?

    Alpha = (col >> 24) & 0xFF;
    Red   = (col >> 16) & 0xFF;
    Green = (col >> 8 ) & 0xFF;
    Blue  = (col      ) & 0xFF;
    

    Das sollte auf jeden Fall funktionieren, egal wie ein int gespeichert ist.


Anmelden zum Antworten