K&R演習[2-8]

課題

整数xの値を右にnビット回転する関数rightrot(x, n)を書け。

回答

#include <stdio.h>

unsigned rightrot(unsigned x, int n);

/*
 * @fn      Main
 * @brief   
 * @param
 * @return
 * @note
 */
int main(void)
{
    unsigned ret, x, n;

    x = 65535;  n = 0;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 65535;  n = 1;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 65535;  n = 2;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 1;      n = 0;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 1;      n = 1;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 1;      n = 2;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);
    x = 12345;  n = 3;  ret = rightrot(x, n);   printf("%5d, %d, %5d\n", x, n, ret);

}

/*
 * @fn      rightrot
 * @brief   
 * @param   
 * @return
 * @note
 */
unsigned rightrot(unsigned x, int n)
{
    unsigned lsb, msb, i;

    for (i = 0; i < n; i++) {
        lsb = x & 1;        // 最下位ビットの取り出し
        msb = lsb << 15;    // 右シフト後に最上位ビットにセットする値
        x = (x >> 1) + msb; // 右シフトして最上位ビットにセットする
//      printf("%5d, %5d, %5d\n", x, lsb, msb);
    }
    return x;
}

実行結果

65535, 0, 65535
65535, 1, 65535
65535, 2, 65535
    1, 0,     1
    1, 1, 32768
    1, 2, 16384
12345, 3,  9735