【C言語】練習2-8

4715 ワード

  • 題出所:『The C programming language』の練習問題P 38
  • 練習2-1:xサイクルを右にシフト(すなわち、最右端から除去されたビットが最左端からシフト)n(バイナリ)ビットを返した値を返す関数rightrot(x,n)を記述する.
    第1の解法構想は、「x最右端右シフト1ビット」と「このビット左シフト最左端」を毎回【または演算】し、n回のサイクルを行えばよい.
    実装コードは次のとおりです.
    #include<stdio.h>
    
    void main(){
        unsigned rightrot(unsigned x, int n);
        unsigned a = rightrot(3,1);
        // 2^31 = 2147483648
        printf("%u
    ",a); } /*rightrot: rotate x to the right by n position*/ unsigned rightrot(unsigned x, int n) { int wordlength(void); int rbit; /* rightmost bit*/ while(n-- > 0) { rbit = x << (wordlength() - 1); x = x >> 1; x = x | rbit; } return x; } int wordlength(void) { int i; unsigned v = (unsigned) ~0; for(i = 1; (v = v >> 1) > 0; ++i) ; return i; }

    第2の解法構想:x中の最右端位が1か0かを判断し、1であれば演算を行い、0であれば直接右にシフトすればよい.
    実装コードは次のとおりです.
    #include<stdio.h>
    
    void main(){
        unsigned rightrot(unsigned x, unsigned n);
        unsigned a = rightrot(3,1);
        printf("%u
    ",a); } unsigned rightrot(unsigned x, unsigned n) { while (n > 0){ if ((x & 1) == 1){ // 1, x = (x >> 1) | ~(~0U >> 1); }else{ // 0 , 。 x = (x >> 1); } n--; } return x; }

    参考資料:http://blog.csdn.net/whdugh/article/details/8162904