2.8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。

Answer Book 

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

源程序:

  /*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 & 1) << (wordlength() - 1);
  x = x >> 1;
     x = x | rbit; 
 }
}

/* 计算出运行程序的计算机所使用的字长 */
int wordlength(void)    
{
 int i;
 unsigned v = (unsigned) ~0;
   
 for(i = 1; (v = v >> 1) > 0; ++i)
  ;
 return i;
}

2.第二种解法

/*
    如果对x进行循环右移的总位数(n)与一个无符号整数的二进制
    位数(即这台计算机的字长)相等,完成这些次循环右移后的结
    果将与x完全一样,因此我们就不必对x进行循环右移了。
    如果n小于这台计算机的字长,那我们就必须把x循环右移n位。
    如果n大于这台计算机的字长,那么,我们只需先(利用取模运
    算符)求出n对这台计算机的字长的余数,再把x循环右移这个余
    数所代表的次数。基于上述分析,我们将得到一个不需要使用循
    环语句的解决方案。
  
    ~0 << n,把一个全1的屏蔽码左移n位,在它的最右端制造出n位0
    ~(~0 << n),把屏蔽码最右端的n位设置为1,其余位则设置为0
  
    当我们用这个屏蔽码和x进行AND运算时,x最右端的n位将被赋值
    给变量rbits。然后,将rbits中的1左移到它的最左端,把x右移
    n位,再对右移后的x和rbits进行OR运算,就完成了对无符号整
    数x循环右移n位
*/
unsigned rightrot(unsigned x,  int  n)
{
    
    unsigned rbits;
    
     if  ((n=n%wordlength()) > 0)
     {
         rbits = x & ~(~0<<n);    n rightmost bi
 
         rbits = rbits << (wordlength()-n);
         x = x >> n;
         x = x | rbits;
     }
  
     return  x;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值