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 254

    Die ü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 😉


Anmelden zum Antworten