解题思路循环右移就是将低位移出去的部分再补到高位上。 例如 rotate_right(0xabcdbeef,8)=0xefabcdbe。
一般情况下,计算机按高位优先顺序存储。也就是说,左边是高位字节,右边是低位字节。低位移出去的部分再补到高位上,即右边的部分移到左边,其余不变。
循环右移可以分为3步,以移动最低位(最右边的那个位)为例:
- 左移31位,把最低位移到最高位,其余全为0:x << 31
- 整体右移1位,低位移出,其余31位顺势右移,最高位为0:x >> 1
- 进行或操作或加操作:(x << 31) + (x >> 1)、(x << 31) | (x >> 1)。
我们以移动一个位扩展到多位,定义变量num,可以得出:
(x << ( 32 - num )) + (x >> num);
另外,本题是对32位无符号整数做循环右移。
对 num 讨论,若num 为负数,x循环右移-1位,就是x循环左移1位,即x右移31位。 若num 比32大,需要进行取模,使运算更方便。
while (num < 0)
{
num = num + 32;
}
num = num % 32;
完整代码
#include运行结果unsigned int rotate_right(unsigned int x,int num) { while (num < 0) { num = num + 32; } num = num % 32; return (x >> num)+(x << (32-num)); } void print_bin(unsigned int x) { unsigned int mask=1u; int i; for(i=31; i>=0; i--) { if ((x & (mask << i)) > 0) { printf("1"); } else { printf("0"); } if (i % 4 == 0) { printf(" "); } } printf("n"); } int main() { unsigned int x; scanf("%x",&x); print_bin(x); print_bin(rotate_right(x,-8)); //循环左移8位 return 0; }
第1行是输入的16进制整数,第2行是整数的二进制表示,第3行是整数循环右移-8位(循环左移8位)后的二进制。



