『新・明解C言語 入門編 第2版』演習問題解答例 7ー3

演習7ー3

問: 符号無し整数xの全ビットを右にnビット回転した値を返すrrotateと、左にnビットした値を返すlrotateを作成せよ。※回転とは、最下位ビットと最上位ビットがつながっているとみなしてシフトすることである。たとえば右に5ビット回転した場合は、シフトによって弾き出される下位5ビットを上位にもってくる。

 unsigned rrotate(unsigned x, int n)
 unsigned lrotate(unsigned x, int n)

//Ex0703.c

#include <stdio.h>

int count_bits(unsigned x)
{
    int bits = 0;
    while(x){
        if(x & 1U) bits++;
        x >>= 1;
    }
    return bits;
}

int int_bits()
{
    return count_bits(~0U);
}

void print_bits(unsigned x)
{
    int i;
    for(i = int_bits() - 1; i >= 0; i--)
        putchar(((x >> i) & 1U) ? '1' : '0');
}

unsigned rrotate(unsigned x, int n)
{
    int i = int_bits();
    return((x >> n | (x << (i - n))));
}

unsigned lrotate(unsigned x, int n)
{
    int i = int_bits();
    return((x << n | x >> (i - n)));
}

int main(void)
{
    unsigned x, n;
    

    printf("非負の整数を入力して下さい:"); scanf("%u",&x);
    printf("何ビット回転しますか:"); scanf("%u",&n);

    printf("\n整数      :"); print_bits(x);
    printf("\n右に%d回転  :",n); print_bits(rrotate(x,n));
    printf("\n左に%d回転  :",n); print_bits(lrotate(x,n));
    puts("");

    return 0;
}

コメント

 特になし。

 


書籍情報


コメント

タイトルとURLをコピーしました