#include /********************************************************************/ /* */ /* 関数名:mask_change */ /* 引 数:unsigned *mask 全て1のビットが立ったマスク */ /*     int count マスクを右からcountビット目までを0にする */ /* 機 能:全て1のビットが立っているマスクを左右に */ /*     シフト演算して、マスクを調整する。 */ /* 戻り値:なし */ /* */ /********************************************************************/ void mask_change(unsigned *mask, int count) { *mask = *mask >> count; *mask = *mask << count; } /********************************************************************/ /* */ /* 関数名:lrotate */ /* 引 数:unsigned x 作業対象の値 */ /*     int n ローテーションするビット数 */ /* 機 能:引数xをnビット左にローテーションする */ /* 戻り値:temp */ /* */ /********************************************************************/ unsigned lrotate(unsigned x, int n) { unsigned temp; unsigned mask = ~0U; print_bits(mask); putchar('\n'); mask_change(&mask, n); print_bits(mask); putchar('\n'); temp = x & mask; x = x << ((unsigned)sizeof(unsigned) * 8 - n); temp >> n; temp = x | temp; return (temp); } /********************************************************************/ /* */ /* 関数名:rrotate */ /* 引 数:unsigned x 作業対象の値 */ /*     int n ローテーションするビット数 */ /* 機 能:右にnビットローテーションさせるということは */ /*     unsignedのサイズからnビット引いた量を */ /*     左ローテーションさせることと同じ。 */ /*     sizeof関数でバイト数が求まるのでその結果に */ /*     8を掛けるというハードコーディングを行っている。 */ /* 戻り値: */ /* */ /********************************************************************/ unsigned rrotate(unsigned x, int n) { lrotate(x, (unsigned)sizeof(unsigned) * 8 - n); } /********************************************************************/ /* */ /* 関数名:count_bits */ /* 引 数:unsigned x */ /* 機 能:ビット数を数える */ /* 戻り値:count(ビット数) */ /* */ /********************************************************************/ int count_bits(unsigned x) { int count = 0; while (x) { if (x & 1U) count++; x >>= 1; } return (count); } /********************************************************************/ /* */ /* 関数名:int_bits */ /* 引 数:なし */ /* 機 能:ビットを全て1で初期化する */ /* 戻り値:count_bitsで数えたビット数 */ /* */ /********************************************************************/ int int_bits(void) { return (count_bits(~0U)); } /********************************************************************/ /* */ /* 関数名:print_bits */ /* 引 数:unsigned x */ /* 機 能:unsignedの値を二進数で表示 */ /* 戻り値:なし */ /* */ /********************************************************************/ void print_bits(unsigned x) { int i; for (i = int_bits() - 1; i >= 0; i--) putchar(((x >> i) & 1U) ? '1' : '0'); } /********************************************************************/ /* */ /* 関数名:main */ /* 引 数:なし */ /* 機 能:作業対象の数値、回転するビット数、回転方向の */ /*     入力を求めて結果を表示する。 */ /* 戻り値:0 */ /* */ /********************************************************************/ int main(void) { unsigned target; int count, direction; printf("Input plus number:"); scanf("%u", &target); printf("How many bits U want 2 shift:"); scanf("%d", &count); printf("Which U want 2 rotate. Right 0, Left 1:"); scanf("%d", &direction); print_bits(target); putchar('\n'); if (direction) target = lrotate(target, count); else target = rrotate(target, count); print_bits(target); putchar('\n'); return (0); }