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

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 

 4 int main(){  5  setbuf(stdout,NULL);  6     int move(int,int);  7     int value,n;  8     int result;  9 

10     printf("Input the value:\n"); 11     scanf("%x",&value); 12 

13     printf("How to move?\n"); 14     scanf("%d",&n); 15 

16     result=move(value,n); 17     printf("after moved:\n%x\n",result); 18 

19     return 0; 20 } 21 

22 int move(int value,int n){ 23     int t; 24     if(n>0) 25  { 26         t=(value&1)<<31; 27         value=(value>>1)|t; 28         n--; 29         value=move(value,n); 30  } 31     else if(n<0) 32  { 33         t=(value&0x80000000)>>31; 34         value=value<<1|t; 35         n++; 36         value=move(value,n); 37  } 38     return value; 39 }

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

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

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

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

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

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

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 

 4 int main(){  5  setbuf(stdout,NULL);  6     int move(int,int);  7     int value,n;  8     int result;  9 

10     printf("Input the value:\n"); 11     scanf("%x",&value); 12 

13     printf("How to move?\n"); 14     scanf("%d",&n); 15 

16     result=move(value,n); 17     printf("after moved:\n%x\n",result); 18 

19     return 0; 20 } 21 

22 int move(int value,int n){ 23     int t; 24     if(n>0) 25  { 26         t=value<<31; 27         value=(value>>1)|t; 28         n--; 29  } 30     else if(n<0) 31  { 32         t=value>>31; 33         value=value<<1|t; 34         n++; 35  } 36 

37     if(n!=0) 38         value=move(value,n); 39     return value; 40 }

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

你可能感兴趣的:(value)