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.