/* 符号無し整数xを右にnビット回転した値を返す関数rrtotateと、 左にnビット回転した値を返す関数lrotateを作成せよ。 */ #include /*---整数x中のセットされたビット数を返す---*/ int count_bits(unsigned x) { int count = 0; while(x){ if ( x & 1U ) count++; x >>= 1; } return count; } /*---unsigned型のビット数を返す---*/ int int_bits(void) { return count_bits(~0U); } /*---unsigned型のビット内容を表示---*/ void print_bits(unsigned x) { int i; for ( i = int_bits() - 1; i >= 0; i-- ) putchar((( x >> i ) & 1U ) ? '1' : '0'); putchar('\n'); } /*符号無し整数xを右にnビット回転した値を返す*/ unsigned rrotate(unsigned x, int n) { int width = int_bits(); return x >> n % width | x << (width - n % width); } /*符号無し整数xを左にnビット回転した値を返す*/ unsigned lrotate(unsigned x, int n) { int width = int_bits(); return x << n % width | x >> (width - n % width); } int main(void) { unsigned no, nor, nol; int n; printf("非負の整数を入力してください:"); scanf("%u", &no); puts("ビットの中身"); print_bits(no); printf("何ビットシフトしますか:"); scanf("%d", &n); puts("右にシフトした後の内容"); nor = rrotate(no, n); print_bits(nor); puts("左にシフトした後の内容"); nol = lrotate(no, n); print_bits(nol); return 0; }