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.