首先,先来看一下十进制的数: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进制字符串