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

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

转载于:https://www.cnblogs.com/Camilo/p/3376848.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值