编写一函数用来实现左右循环移位。函数原型为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 }
这样写的话,停止递归调用的条件比较明显,程序易读