编写一函数用来实现左右循环移位。函数原型为move(value,n);n>0时右移n位,n<0时左移|n|位。

时间:2022-03-30 16:09:21
 #include<stdio.h>
#include<stdlib.h> int main(){
setbuf(stdout,NULL);
int move(int,int);
int value,n;
int result; printf("Input the value:\n");
scanf("%x",&value); printf("How to move?\n");
scanf("%d",&n); result=move(value,n);
printf("after moved:\n%x\n",result); return ;
} int move(int value,int n){
int t;
if(n>)
{
t=(value&)<<;
value=(value>>)|t;
n--;
value=move(value,n);
}
else if(n<)
{
t=(value&0x80000000)>>;
value=value<<|t;
n++;
value=move(value,n);
}
return value;
}

第一次自己写递归调用的函数,结果还是比较满意的

每次调用move循环左移或者右移1位,n=0时,停止递归调用

参考答案后,可改进的地方有

26  t=value<<31;  直接左移31位,不需要将前面的二进制位清零后再左移,多此一举。

33  t=value>>31;  道理同上。

写博的过程中,我又想改进一下:

 #include<stdio.h>
#include<stdlib.h> int main(){
setbuf(stdout,NULL);
int move(int,int);
int value,n;
int result; printf("Input the value:\n");
scanf("%x",&value); printf("How to move?\n");
scanf("%d",&n); result=move(value,n);
printf("after moved:\n%x\n",result); return ;
} int move(int value,int n){
int t;
if(n>)
{
t=value<<;
value=(value>>)|t;
n--;
}
else if(n<)
{
t=value>>;
value=value<<|t;
n++;
} if(n!=)
value=move(value,n);
return value;
}

这样写的话,停止递归调用的条件比较明显,程序易读