右循環シフトを行う関数、 rightrot(x, n)を作れという問題。
初めは 1ビットずつ循環させるものを見ないといけないのかな〜と思ったけど、
考えてみると、先に下位 nビットを 上位 nビットに設定すればいいんですね。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "util.h"
static unsigned int rightrot(unsigned int x, int n);
static void test_rightrot();
int
main (void)
{
test_rightrot();
printf("ans = %u\n", rightrot(0x1, 1));
}
static void
test_rightrot()
{
assert(rightrot(0, 1) == 0);
assert(rightrot(1, 1) == 0x80000000U);
assert(rightrot(3, 2) == 0xc0000000U);
assert(rightrot(0xf, 4) == 0xf0000000U);
assert(rightrot(0xffff, 16) == 0xffff0000U);
}
static
unsigned int rightrot(unsigned int x, int n)
{
int i;
unsigned int tmp;
tmp = ~(~0 << n);
tmp = x & tmp;
tmp = tmp << ((sizeof(unsigned int) * 8) - n);
return (x >> n) | tmp;
}