Funktion rotate_right aus Kernighan & Ritchie



  • Hello world,

    Ich hab zu der Aufgabenstellung 2.8 aus Programmieren in C von K&R
    ein Programm geschrieben, weiss jetzt aber nicht, ob das der Aufgaben-
    stellung gerecht wird. Hier erstmal die Aufgabenstellung:

    Schreiben Sie eine Funktion rightrot(x,n), die den Integer-Wert x um n Bit-Positionen nach rechts rotiert.

    Und hier mein Code:

    #include <stdio.h>
    
    int rightrot(int x, int n);
    
    int main()
    {
    
    printf("0x%x\n", rightrot(0x19,2));
    
    return 0;
    }
    
    int rightrot(int x, int n)
    {
        int size=sizeof(int)*8;
    
    return (x << n) | (((x & (~0 << (size-n))) >> (size-n)) & (~(~0 << n)));
    }
    

    tHx



  • Irgendwie sieht mir deine Vorgehensweise ziemlich kompliziert aus. Hab deshalb erst gar nicht versucht da durchzublicken. Ich könnte dir aber folgende Lösung anbieten

    #define bit_sizeof(x) (sizeof(x) * CHAR_BIT)
    
    int rightrot(int x, size_t count)
    {
    	unsigned int u = x;
    	return (u >> count) | (u << (bit_sizeof(u) - count));
    }
    

    Wichtig ist nur, dass du unsigned shiftest, da negative signed Werte zu shiften, implementationsabhängig ist.



  • /* 32 bits */
    unsigned int rightrot (unsigned int w, unsigned int s)  
    {
       s = s & 31;
       return (w << 32-s) | (w >> s);
    }
    


  • Danke groovemaster, danke Abkürzer. Mir scheint, ich muss noch an meinem Sinn für
    klaren und verständlichen Code feilen.

    @Abkürzer: Ist es denn garantiert, das ein int 32bit hat? afaik nicht!



  • dazu gibt es sizeof(), was die größe in bytes zurückgibt.
    du kannst dann ruhig von 8 bits pro byte ausgehen.


Anmelden zum Antworten