zoukankan      html  css  js  c++  java
  • 编写一函数用来实现左右循环移位。函数原型为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:
    ");
    11     scanf("%x",&value);
    12 
    13     printf("How to move?
    ");
    14     scanf("%d",&n);
    15 
    16     result=move(value,n);
    17     printf("after moved:
    %x
    ",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:
    ");
    11     scanf("%x",&value);
    12 
    13     printf("How to move?
    ");
    14     scanf("%d",&n);
    15 
    16     result=move(value,n);
    17     printf("after moved:
    %x
    ",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 }

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

  • 相关阅读:
    初识分布式计算:从MapReduce到Yarn&Fuxi
    日志的艺术(The art of logging)
    关于负载均衡的一切:总结与思考
    打印中文dict list的各种姿势
    不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
    什么是分布式系统,如何学习分布式系统
    再论分布式事务:从理论到实践
    从银行转账失败到分布式事务:总结与思考
    git命令
    IntelliJ idea 中使用Git
  • 原文地址:https://www.cnblogs.com/Camilo/p/3376848.html
Copyright © 2011-2022 走看看