一十进制就是逢十进一(0,1,2,3,4,5,6,7,8,9,后面就要进位才能表示了)
十六进制就是逢十六进一(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,后面就要进位才能表示了)
所谓进制就是单个数不能表示时要用二位数及二位数以上的数表示的处理办法.其实可以任意进制,只是要用起来方便罢了,比如时间就是60进制,纪年中的世纪是一百进度,圆的一周用度数表示时是360进制.
十进制: 34 就是 3 * 10^1 + 4 * 10^0
而在十六进制中: 34就是 3 * 16^1 + 4 * 16^0 (转换成十进制只需乘出
结果就行了,得52,即十六进制中的34为十进制中的52)
十进制化为十六进制就是除16的办法: 34除以16,得2余2,即为22,即十进制中的34
这十六进制中的22
(即:十六进制化成十进制是乘16,十进制化成十六进制是除16)
事实上,k(k是正整数)进制数逢k进一这么个意义,一个十进制数可写成
a(n)*10^n+...+a(1)*10+a(0)+a(-1)*10^(-1)+... (a(i)表示0—9中的某个数)
同样,k进制数有形式:
b(n)*k^n+...+b(1)*k+b(0)+b(-1)*k^(-1)+... (b(i)表示0—(k-1)中的某个数)
当一个k进制数要转化为十进制数时,用上式直接计算即可;而当十进制数要转化为k进制数时,则对其整数部分除k取余,对其小数部分则乘k取整,此过程下以十进制转化十六进制为例举一例:
十进制数1673.59375
1673/16=104...9 , 104/16=6...8 , 6/16=0...6;
0.59375*16=9.5 (取9), 0.5*16=8.0 (取8).
所以十进制数1673.59375转化为十六进制数后为: 986.98
二数的进制和进制转换
考虑一个10进制数123,数字1、2、3在这个数中的重要性是不一样的,3代表的是100的3倍,2代表101的2倍,而1代表的则是102的1倍。数学上把100,101和102称为对应数位上的权重(简称权),分别表示了对应位上的数字对整个数值的“贡献”。对于10进制数来说,各位权从小到大分别是100、101、102……,都是10的各次幂。对于各位上的数字,我们称为某权的系数,简称系数。
其他进制数也存在同样的问题,例如2进制数各位权重分别是2的各次幂,8进制数是8的各次幂等等。
需要说明的是,各种进制数都是人们为了理解数而进行的一种表述,在计算机计算过程中,是不存在进制这种概念的,对于C语言表示数的三种形式:0x12(16进制)、18(10进制)和022(8进制),在内存中都是一样的。
如果已经知道一个数k,在某种进制w条件下,计算各位的系数一般采用除余法,基本算法如下:
首先估计这个数的最大位数N
n = N,divisor = wn-1
b(n) = k / divisor, k = k % divisor,divisor = divisor /w,n --
如果n ==0算法结束 ,否则转3
例如对于C语言中的unsigned char 类型,最大可能为3位8进制数,如果已经知道一个数n=252,计算8进制的过程如下:
N =3
n = N,divisor = 8n-1 = 64
b(3) = 252 / 64 = 3, k = k % 64 =60,divisor = divisor /8 = 8,n -- = 2
b(2) = 60/8 = 7,k = k %8 =4,divisor = 8/8 =1,n = 1
b(1) = k / 1= 4 ,k=k %1 =0,divisor = 1/8,n = 0
n == 0算法结束
计算结果252就是8进制数0374
如果不按照上面的幂次方式规定各位数的权,也可以定义一些特殊的进制数。例如,我们按照从小到大顺序分别规定各位的权重分别为w(n),n=1,2,3....,(注意,必须满足w(n) | w(m),n<= m,也就是低位权必须能整除高位权)已知一个数计算各位系数也一样可以采用修正后的除余法。修正后的除余法为:
首先估计这个数的最大位数N
n = N,divisor = w(n)
b(n) = k / divisor, k = k % divisor,n--,divisor = w(n)
如果n ==0算法结束 ,否则转3
可见,当w(n) = bn时,这个修正的除余法就和开始的除余法等价了
如果需要在不同进制间转换,最简单的方法是先把一种不容易进行四则运算的进制转换成容易进行四则运算的10进制,然后利用除余法转换成给定的进制。例如对于022,很容易利用权的定义计算出他的10进制形式为2 * 81 + 2 * 80 = 18,转换成16进制利用除余法可以得到为0x12。