課題
整数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