进制间转换的理论和实现不同

首先,先来看一下十进制的数: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("报警!请重新输入:\n");  
        else  
           printf("%d进制数 %d 转换为十进制为 : %d\n\n",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进制字符串

 

posted @ 2016-07-27 18:16  Lunais  阅读(362)  评论(0编辑  收藏  举报