Kann mir das mal einer übersetzen?
-
Ich habe hier eine Funktion die ich nicht verstehe. Die Funktion setzt in einem 3D Volumen einen Punkt auf 0 bzw 1
inline void SetVoxel( const int nX, const int nY, const int nZ, bool value) { if ( value ) // Set to 1 volume3D[(nZ*m_nSizeY+ nY)*m_nElemPerRow + (nX >> 3)] |= (0x80 >> (nX & 0x07)); else // set to 0 volume3D[(nZ*m_nSizeY+ nY)*m_nElemPerRow + (nX >> 3)] &= ~(0x80 >> (nX & 0x07));(Anmerkung: die funktion tut was sie soll...nur komme ich nicht dahinter WIE sie das tut. besonders der letzte teil der zeilen, also "(nX >> 3)] |= (0x80 >> (nX & 0x07))" bzw. "(nX >> 3)] &= ~(0x80 >> (nX & 0x07))" finde ich mehr als kryptisch...irgendwas mit nem bitweisen OR und nem right shift? Hä? )
Kann mir das jemand mal auf 3-Klässler Niveau erklären? Danke
-
Schau mal nach bitweisem "Oder", "Und", "Nicht" und nach bitshifts ...
gruß
-
Moin moin !
Es hilft dem Verständnis, wenn man sich solche Ausdrücke in binärer Form auf
ein Blatt Papier schreibt und in Teilausdrücke zerlegt.Vom hexadezimalen ins binäre ist es relativ einfach:
0xFF ist z.B. 1111 1111
0xA0 ist z.B. 1010 0000
0x73 ist z.B. 0111 0011
usw.
Aber da 'erzähle' ich dir bestimmt nix neues.Here we go:
( nX & 0x07 )
- abhängig von nX, kann der Klammerausdruck Werte von 0 bis 7 annehmen.0x80 >>
- 0x80 ist dezimal 128. Die Zahl 128 wird also 0 bis 7 mal nach rechts
geshiftet.Damit kann also der Ausdruck 0x80 >> ( nX & 0x07 ) acht verschiedene
Werte annehmen:
128, 64, 32, 16, 8, 4, 2, 1, je nachdem wie oft nach rechts geshiftet wird.Das Maximum dieser 8 Werte ist also: 128 dezimal und binär 10000000
Und das Minimum ist: 1 dezimal und binär 00000001~(0x80 >> (nX & 0x07))
Die Tilde vor der Klammer ist der bitweise Negationsoperator.
Negiertes Maximum: 01111111 binär und dezimal 127
Negiertes Minimum: 11111110 binär und dezimal 254Die übrigen 6 Werte kannst du dir selber denken, hinschreiben, was auch
immer. ( oder es auch bleiben lassen
)Damit kann also der Kram hier: ~(0x80 >> (nX & 0x07))
Werte von 127 dez bis 254 dez annehmen.|= ist eine bitweise Oderverknüpfung und &= eine bitweise Undverknüpfung.
Was diese beiden Verknüpfungen machen ist klar oder ?Vielleicht könnte man noch erwähnen, das der Ausdruck (nX >> 3) Null
werden kann, nämlich dann wenn gilt: ( nX < 8 && nX > 0 )Das volume3D-Array wird also abhängig von den übergebenen Parametern
adressiert und der so adressierte Wert bedingt durch den Parameter value entsprechend Verknüpft, wodurch
sich der adressierte Wert ändert.
Aber so genau wolltest du das sowieso nicht wissen oder ?


-
doch... so genau wollt ichs wissen. danke

-

-

Da haste dir aber ein bissl mehr Mühe mit der Erklärung gegeben als ich
