zoukankan      html  css  js  c++  java
  • 进制间转换的理论和实现不同

    首先,先来看一下十进制的数:a = 234

    十进制数性质:
    a % 10 = 4    //求余,取十进制数的最后一位
    a / 10 = 23    //整除,去除十进制数的最后一位

    以此类推,一个二进制的数1101对2求余,对2整除是不是可以得到二进制数最后一位,去除二进制最后一位呢?

    答案在理论上是肯定的。

    but,程序写的时候怎么定义类型来存储一个二进制数呢?其实是: int b = 1101

    wait,这不是十进制数 1101 么。恩恩,我们要做的就是把十进制数1101(一千一百零一)看成二进制,算出个13的十进制数。

    so,这个1101实际上还是个十进制数,只不过我们把它看做二进制而已,当然就不满足理论上二进制的性质了,但可以借助十进制的性质。

    程序实现时,二进制数(表象,实际还是十进制数)特性有哪些呢,我们模拟出来:

    1、每位上的数都是小于2(进制数)的整数,即:0和1。       注:做进制转换时,为了模仿的逼真,判断每位的值,大于1(进制数 - 1)的果断预警

    2、可以转化为 十进制数。     注:由于实际上是还是十进制数存储,利用十进制的性质 取数 和 去除数 即可。取数后乘以相应的 进制数 n次方,最后求和即可

    一、   x进制数转化为十进制数:

    int anyToTen(int x,int num)   //x进制,num为模拟的x进制的值(实际是个十进制) 
    {  
          int i , flag = 0, sum = 0;  
          for(i=1;num!=0;i*=x)     // i *= x,实现了进制的n次方 
         {   
                if(num%10>(x-1))    //按照10进制的性质取数(最后一位),判断是否大于(进制数 - 1),是就报警
                {   
                   flag = 1;                //是否预警的风向标
                   break;   
                }   
                else   
               {    
                   sum += ( num % 10 ) * i;        //低位开始,相应位 乘以 进制的 n次方
                   num = num / 10;                     //去除低位,算完一个丢一个   
               }  
          } 
            if(j==1)  
               printf("报警!请重新输入:
    ");  
            else  
               printf("%d进制数 %d 转换为十进制为 : %d
    
    ",x,num,sum);  
            return sum; 
    }

    二、   十进制数转化为x进制数

    原理:十进制数5,转为二进制数:

    5 % 2 = 1     //余数为 1     ;              5  / 2 = 2      //商为 2

    2 % 2 = 0     //余数为 0     ;              2  / 2 = 2      //商为 1

    1 % 2 = 1     //余数为 1     ;              1  / 2 = 0      //商为 2

    商为0终止,余数逆序 即可: 101(额,第一个1是最后算出来的那个,这个例子不好,明白原理就行)

    void tenToAny(int num, int x)
    {
      int i;
      int *array = NULL;   //定义个数组指针
      for(i = 0; num != 0; i++)
      {
        array = &(num % x);
        array++;
        num /= x;
      }
      while(array != NULL)
      {
        switch(*array)
        {
          case 10 : 
              printf("A");
            break;       case 11 :
              printf("B");
           break;       case 12 :
              printf("C");
            break;       case 13 :
              printf("D");
            break;       case 14 :
              printf("E");
            break;       case 15 :
              printf("F");
            break;       default :
              printf("%d" , *array); //二进制(0和1)和八进制(0到7),十六进制(0到F)     }
        array--;   } }

    三、 二进制、八进制、十六进制

    程序:利用十进制作为中介,两次转换即可。

    实际口算时:可以利用由低位到高位组团,高位不够数的补0

    二进制11转八进制:即011->3

    二进制11转十六进制:即0011->3

    注意一下范围就行:八进制:0 ~ 7  ;

             十六进制:0 ~ F  ;

     四、字符串间的进制转换

    将10进制字符串转换成16进制字符串

  • 相关阅读:
    centos 安装docker
    vsphere client 创建虚拟机 如何关联到本地iso文件
    在centos7中使用supermin制作centos6.5docker镜像
    centos安装后,连接不上网络,yum命令执行can not find a valid baseurl for repo: base/7/x86-64
    佛祖保佑,永无BUG
    框架原理
    android 中解析XML的方法(转)
    android 项目随记一
    android事件系列-onTouch事件与手势操作
    深入理解 AngularJS 的 Scope(转)
  • 原文地址:https://www.cnblogs.com/Lunais/p/5712152.html
Copyright © 2011-2022 走看看