- 常用进制:二进制、十进制、八进制、十六进制
数学计算:
-
普通方法:用给定的数除以进制基数,得到的余数记录,得到的商继续重复上述操作,直到商为0,所有得到的余数反向记录,就可以转化为需要的进制数。
(1)给定的数/进制基数——>余数+商
(2)商/进制基数——>余数+商(新得到的商作为给定数重复(1)过程)
(3)直到商为0
-
特殊方法:对除法进行每一位运算,模拟上述过程;
(1)如何模拟给定数/进制基数得到商和余数的过程:
举例:给定数为237,进制基数为2
第一个数字2::2/2=1 2%2=0
第二个数字3: 先用上一步的余数0乘10加上3得到新的被除数:0*10+3=3
3/2=1 3%2=1
第三个数字6: 先用上一步的余数1乘10加上3得到新的被除数:1*10+7=17
17/2=8 17%2=1
直到所有的数字被处理完,最后一步得到的余数就是最后的余数,每一步得到的除数(按得到先后排列)就是商;
如上237/2=118 237%2=1
(2) 如何模拟商/进制基数得到商和余数的过程:用(1)得到商作为给定数重复(1)过程,直到商为0;
举例:接上例,将给定数转化为二进制数
118重复(1)得到新的商:59,余数:0
59重复(1)得到新的商:29,余数:1
29重复(1)得到新的商:14,余数:1
14重复(1)得到新的商:7,余数:0
7重复(1)得到新的商:3,余数:1
3重复(1)得到新的商:1,余数:1
1重复(1)得到新的商:0,余数:1
最后得到的二进制表达为11101101
用C语言实现进制转换:(以十进制转化为其他进制为例)
- 十进制数位数少,可以直接表示(反复取余得商,等同于常规计算方法)
- 十进制数位数大 ,用字符串表示,需要对每一位进行计算,利用特殊计算方法;代码如下:
#include <stdio.h> #include <string.h> int BASE; //进制基数 int DLEN; //十进制数长度 int transform(int code[], int a[], int k) { int i; for (i = 0; i < DLEN; i++) { //寻找到a[]中最高的非0位,为处理的起点 if (a[i] != 0) { break; } } if(i==DLEN) return k;//完成进制转换的标志,在for循环结束后,i==DLEN,证明所有字符串均为0,证明已完成转化 int mod = 0;//保存余数 int temp;//保存余数和下一位运算后的数 while(i<DLEN) { temp=mod*10+a[i];//余数和下一位数进行特定运算 a[i]=temp/BASE;//更新a[],保存新的商,以备下次计算 mod=temp%BASE;//保存余数 i++; } code[k] = mod;//最终得到的余数保存到code[]中 return transform(code, a, k + 1); //递归处理所有商 } int main() { char str[321] = {0};//存储十进制数 int nCode[1101] = {0}, nStr[321] = {0};//转化后的数的字符表示数组和数字表示 gets(str);//输入十进制数 DLEN = strlen(str);//十进制数长度 scanf("%d", &BASE);//读入基数 for (int i = 0; i < DLEN; i++) { nStr[i] = str[i] - '0';//符号转为数字 } int codeLen = transform(nCode, nStr, 0);//转化后的长度 for (int i = codeLen - 1; i >= 0; i--) { printf("%d", nCode[i]); } return 0; }