- 题目来源:《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(,);
// 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-- > )
{
rbit = x << (wordlength() - );
x = x >> ;
x = x | rbit;
}
return x;
}
int wordlength(void)
{
int i;
unsigned v = (unsigned) ~; for(i = ; (v = v >> ) > ; ++i)
;
return i;
}
第二种解法思路:判断 x 中最右端位是1还是0,是1就进行运算,若是0 ,直接右移即可。
实现代码如下:
#include<stdio.h> void main(){
unsigned rightrot(unsigned x, unsigned n);
unsigned a = rightrot(,);
printf("%u\n",a);
} unsigned rightrot(unsigned x, unsigned n)
{
while (n > ){
if ((x & ) == ){ //如果最右端位为 1,进行运算
x = (x >> ) | ~(~0U >> );
}else{ //若是0 ,直接右移即可。
x = (x >> );
}
n--;
}
return x;
}