dword ein bitfeld?



  • ich bin jetzt mit der directx farbverarbeitung dran, und als ich nach infocode gesucht hab, hab ich folgenden code gefunden:

    inline operator DWORD () const
    	{
    		return ((a >= 1.0f ? 255 : a <= 0.0f ? 0 : (DWORD)(a * 255.0f)) << 24) |
    			   ((r >= 1.0f ? 255 : r <= 0.0f ? 0 : (DWORD)(r * 255.0f)) << 16) |
    			   ((g >= 1.0f ? 255 : g <= 0.0f ? 0 : (DWORD)(g * 255.0f)) << 8)  |
    			   (b >= 1.0f ? 255 : b <= 0.0f ? 0 : (DWORD)(b * 255.0f));
    	}
    

    rein theoretisch soll der code die 4 farbwerte RGB und A in eine dword variable casten,doch versteh ich nich wie das funktionieren soll, nach einiger zeit nachschlagen kam ich darauf, dass hier ein "bitfeld" verwendet wird, das thema wird aber nur ganz kurz in meinem nachschlagewerk angeschnitten,sodass ich nur vermuten kann,was dieses bitfeld macht.
    lieg ich denn mit meiner vermutung richtig, dass der code aus den 4 einzelwerten einen langen zusammenschustert?(also aus den beispielwerten 13,24,35,10 13243510 wird?)

    und ist es eigentlich ansi konform einen typecast(hoffe dies ist das richtige wort für DWORD()) zu überladen?



  • Ob das so ansikonform ist kann ich dir nicht sagen.
    Aber das ist auch egal, solange es funktioniert.

    Was hier passiert ist das 4 verschiedene Werte mit einer Oder-Bitverknüpfung in ein DWORD "gepresst" werden.

    Stell dir 2 Bytes vor.
    Das eine sieht in den Bitstellen so aus : 10010000
    und das zweite sieht so aus : 00001011

    Wenn du die beiden jetzt mit Oder ( | <- Zeichen für Oder) Verknüpfst, kommt folgendes raus: 100110111



  • Ja, das ist standardkonform (siehe http://www.kuzbass.ru:8086/docs/isocpp/special.html Abschnitt 12.3.2). Das inline an der Stelle ist übrigens überflüssig, Memberfunktionen, die innerhalb der Klassendefinition ausformuliert sind, sind automatisch inline.



  • hmm ich danke schonmal 😉
    aber eine frage hab ich noch hierzu:
    "<< 24" bedeutet das, dass die bits nach dem 24. beladen werden?



  • Nein, das bedeutet, dass sie um 24 Stellen nach links verschoben werden.

    00000000000000000000000010101010 << 24 = 10101010000000000000000000000000



  • hmm also wenn ich 2 bitwerte hab:
    1. 11111111 und 2. 00010000

    und ich die dann beide in eine variable einsetze(wobei 2. <<8)
    dann würde die variable nach dem füllen so aussehen oder?

    1111111100010000



  • ja. genauso arbeitet auch die Funktion oben



  • supi, dann werd ichs mal anwenden 😃



  • Du kannst es auch einfach so sehen:
    x << y = z --> x * 2^y = z

    Beispiel:

    10 << 24 = 167772160 --> 10 * 2^24 = 167772160


Anmelden zum Antworten