这个函数的一个关键点在于,如果想移植性更好的话,得先要找到类型的位数。
对于右移循环,能够尽量少地增加新的变量作为缓冲最好。
#include<stdio.h>
void rightrot(unsigned x, unsigned n);
float power(unsigned int a, unsigned int b);
unsigned int len;
main() {
unsigned int i,x,n;
i=1;
while((unsigned int)power(2, i++)!=0) /* 查找unsigned int 所占位数,赋值给len */
;
len=i-1;
x=7; /* 初始化x,n */
n=12;
rightrot(x,n);
return 0;
}
float power(unsigned int a, unsigned int b) { /* 重新写了一个求幂的函数 */
float c;
c=1;
while(b-->0)
c=c*a;
return c;
}
void rightrot(unsigned x, unsigned n) {
unsigned int x_1,i,k,c;
k=x_1=0;
for(i=1; i<=n; ++i)
{
x_1=(x>>(k++)<<(len-1)>>(i-1)|x_1); /* 右移某位,先使其成为最右位,再成为最左位,再右移其原始位置离最右位的距离,完成对称,累计进行或操作 */
}
c=(x_1|(x>>n));
printf("%u",c);
}