C程序设计语言第二版习题2-8

问题描述

编写一个函数rightrot(x, n),该函数返回将x循环右移n位所得到的值。

这个问题的理解是: 将x进行右移n位,每次移动都将右侧的最后一位移到左侧第一位。

问题分解

  • 主函数main
  • 核心函数 rightrot(x, n)。 这道题需要我们留心观察右移的规律,首先常规的右移很好表示,因此难点在如何表示右侧的最后一位移到左侧的第一位。通过分析,我们可以知道需要判断x的最右端位是1还是0,是1就进行特殊运算,若是0 ,直接右移即可。算法描述可以为:

    1. 当x的最后一位为0, 则只要进行常规的右移1位即可,即x >> 1
    2. 当x的最后一位为1,则移动后 x的左侧第一位变为1,其他位进行正常右移,即 (x >> 1) | ~(~0 >> 1)
    3. 按照i、ii执行n步即可

代码实现

#include<stdio.h>

unsigned rightrot(unsigned x, int n);
​
int main()
{
​
        int n;
​
        unsigned x, r;
​
        n = 1;
​
        x = 74;
​
        r = rightrot(x, n);
​
        printf("The result is: %u  \n", r);
​
        return 0;
}
​
​
​
unsigned rightrot(unsigned x, int n)
{
    while (n-- > 0)
    {
​
        if ((x & 1) == 1)  //如果最右端位为 1
​
           x = (x >> 1) | ~(~0 >> 1);
       else 
           x = (x >> 1);
    }
    return x;
}
上一篇:如何判断当前程序是否运行在虚拟机内


下一篇:C程序设计语言习题2-3答案