Bits ermitteln



  • Hallo,

    derzeit befasse ich mich mit dem Werk: "The C Programming Language" von den Entwicklern von C und bin mir etwas unsicher bei einem Beispiel für bitweise Operatoren.

    Es ist die Funktion getbits(x, p, n) gegeben, welche das rechtsjustierte n-bit große Feld von X an der Position p wiedergeben soll.

    Die Funktion ist wie folgt implementiert:

    /*getbits: get n bits from position p */
    unsigned getbits(unsigned x, int p, int n) {
        return (x >> (p + 1 - n)) & ~(~0 << n);
    }
    

    Beim Herumspielen mit der Funktionen durch verschiedene Eingaben ist mir aufgefallen, dass der Aufruf getbits(56, 4, 3) mir als Ergebnis 6 zurückgibt.
    Händisches nachrechnen machte mich dann etwas stutzig, da:

    56:                0 0 1 1 1 0 0 0
    x >> (4 + 1 - 3):  0 0 0 0 1 1 1 0 => Bits um [u]2[/u] Positionen verrückt und nicht vollends rechts
    ~(~0 << 3):        0 0 0 0 0 1 1 1
    bitweise UND:      0 0 0 0 0 1 1 0 => Ergebnis 6
    

    Meiner Meinung nach müsste in diesem Beispiel das return Statement wie folgt lauten:

    return (x >> (p - 1)) & ~(~0 << n);
    

    Dann werden die Bits an der entsprechenden Position vollends nach rechts gerückt und können für die Ausgabe maskiert werden. Oder hab ich eventuell einen Denkfehler gemacht und was übersehen?

    Gruß,
    Nirvash



  • Ich vermute, dass du die Bits anders zählst als die Autoren des Buches. Das wird so gemeint sein:

    56:                0 0 1 1 1 0 0 0
    Positionen:        7 6 5 4 3 2 1 0
                             ^
    getbits(56, 4, 3):      |1 2 3|     = 110
    


  • Hab mich mit deinem Hinweiß nochmal hingesetzt und einige Beispiele durchgerechnet. Jetzt stimmt auch alles so wie es sein sollte. Danke dir!



  • seldon schrieb:

    Ich vermute, dass du die Bits anders zählst als die Autoren des Buches. Das wird so gemeint sein:

    56:                0 0 1 1 1 0 0 0
    Positionen:        7 6 5 4 3 2 1 0
                             ^
    getbits(56, 4, 3):      |1 2 3|     = 110
    

    Das hast du gut, einfach und schön illustriert/formatiert.
    Respekt.


Anmelden zum Antworten