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

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

  • 相关阅读:
    LNMP分离部署
    PXE
    Mysql
    07.23 课堂随笔 学习了相关的标签
    [Prodinner项目]学习分享_第三部分_Service层(业务逻辑层)
    Beginning Windows Azure Development Guide
    5分钟浅析简单工厂模式
    [Prodinner项目]学习分享_第一部分_Model层
    [Prodinner项目]学习分享_第四部分(完结篇)_Controller层(控制器)
    C# Windows service 开发笔录
  • 原文地址:https://www.cnblogs.com/Camilo/p/3376848.html
Copyright © 2020-2023  润新知