【C语言】练习2-8

  •  题目来源:《The C programming language》中的习题P38
  •  练习2-1:  编写一个函数rightrot(x,n),该函数返回将x循环右移(即从最右端移除的位将从最左端移入)n(二进制)位后所得到的值。

  第一种解法思路:每次将【x最右端右移1位】与【该位左移到最左端】  进行【或运算】 ,这样进行n次循环即可。

  实现代码如下:

#include<stdio.h>

void main(){
    unsigned rightrot(unsigned x, int n);
    unsigned a = rightrot(3,1);
    // 2^31 = 2147483648
    printf("%u\n",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;
}

  第二种解法思路:判断 x 中最右端位是1还是0,是1就进行运算,若是0 ,直接右移即可。

  实现代码如下:

#include<stdio.h>

void main(){
    unsigned rightrot(unsigned x, unsigned n);
    unsigned a = rightrot(3,1);
    printf("%u\n",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

posted @ 2014-06-10 21:42  NW_KNIFE  阅读(535)  评论(0编辑  收藏  举报