Bit rotieren



  • Hallo,
    kann mir vielleicht jemand sagen was hier falsch ist?
    Es soll ganz einfach ein int Zahl um 1 Bit nach rechts rotieren.

    int ror(unsigned int x)
    {
    	int n = 0x1;
    	printf("%i", (x >> n) | (x >> (0x1F & (32 + ~n + 1))) & ~(0x80000000 << n));
    }
    


  • Was sollen denn die einzelnen Teile deines Ausdrucks machen?

    Und %i ist der falsche Formatspecifier für unsigned int .



  • Spricht irgendwas dagegen, das auf ganz naive Weise zu implementieren?

    #include <limits>
    
    unsigned int ror(unsigned int i) {
        auto rightmost = i & 1;
        i = i >> 1;
        i = i | (rightmost << (std::numeric_limits<unsigned int>::digits-1));
        return i;
    }
    
    int main(int argc, char **) {
        return ror(argc);
    }
    

    Wenn man sich mal das Assembly dazu anguckt, kommt da z.B. bei gcc 5.1 mit -O2 sowieso "ror eax" raus.

    Also: keine unnötigen komischen Spielchen. Und wenn man magische Zahlen wie 32, 0x1F oder 0x80000000 nutzt, sollte man diese kommentieren.



  • wob schrieb:

    Spricht irgendwas dagegen, das auf ganz naive Weise zu implementieren?

    Nein

    wob schrieb:

    Wenn man sich mal das Assembly dazu anguckt, kommt da z.B. bei gcc 5.1 mit -O2 sowieso "ror eax" raus.

    Eben drum.
    Mittlerweile können die Compiler das.


Log in to reply