编写一函数用来实现左右循环移位。函数原型为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 }

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

posted @ 2013-10-18 21:41  Andy Cheung  阅读(1626)  评论(0编辑  收藏  举报