我们最熟悉的进制就是从小就学的十进制,“逢十进一”如:
然而在计算机CPU操作都是二进制数据0或1,这样就需要我们进行进制的的转换,这里的二进制就是,“逢二进一”如:
八进制为,“逢八进一”如:
十六进制为,“逢十六进一”如:
进制转换原理
进制转换分:整数部分和小数部分
1,整数间十进制转其他格式:
十进制整数转换为(R)进制整数采用"除R取余,逆序排列"法。具体做法是:用R去除十进制整数,可以得到一个商和余数;再用R去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为R进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来,如10转2:
考虑到一个字节是8个二进制位,所以我们在"最高位"也就是"第7位"上补0,形成如下最终答案:
再看二进制加法的过程,注意:逢二进一!
那么,二进制的10110011表示为十进制,应该是多少呢?计算过程如下:
2,小数部分十进制转其他格式:
十进制小数转换成(R)进制小数采用"乘R取整,顺序排列"法。具体做法是:用R乘十进制小数,可以得到积,将积的整数部分取出,再用R乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1。或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为R进制小数的高位有效位,后取的整数作为低位有效位。
0.625 * 2 1
0.25 * 2 0
0.5 * 2 1
值为0.101
0.3 * 2 0
0.6 * 2 1
0.2 * 2 0
0.4 * 2 0
0.8 * 2 1
0.6 * 2 1
值为:0.010011(取小数点前6位)
八进制和十六进制
无论是八进制或是十六进制,都不是电脑所能"理解"的。那为什么需要这两种进制呢?原因是,八进制和十六进制能够有效地提高二进制计算的效率。换句话说,八进制或十六进制能够很方便地和二进制进行相互转换。
先来说说八进制:
八进制"逢8进一"。注意到:3个二进制位正好能表达1个八进制位的信息。1个八进制位有共8种状态,对应的3个二进制位是 所以,八进制和二进制的转换方式是十分简单的:3个二进制位转换成对应的1个八进制位。
举例来说,二进制到八进制的转换如下图所示:
其中,每3位二进制数转换为1位八进制数。注意到上图二进制数中,最左侧的0是我们手动补上去的,为的是凑足3个数进行转换。同理,我们有下图:
把2个八进制数相加:
按权展开,验算一下:
这与十进制数计算的答案是相符的。说明我们的八进制运算是正确的。
八进制转为二进制,得到二进制的答案:
由上运算过程可见,八进制的表示法,比二进制的表示法来得方便。
再来看看十六进制:
这和八进制的形式很相似。只不过:
十六进制"逢16进一"。1个十六进制位对应的数值表示是:0~9,A,B,C,D,E,F;其中,A,B,C,D,E,F分别对应十进制的10,11,12,13,14,15。我们注意到:4个二进制位正好能表达1个十六进制位的信息。1个十六进制位有共16种状态,对应的4个二进制位是 所以,十六进制和二进制的转换方式是十分简单的:4个二进制位转换成对应的1个十六进制位。
以上题为例,我们再用十六进制做个转换计算的例子:
另一个数:
二者相加:
按权展开,得到:
同样地,我们也可以很方便地把上述十六进制的值再转为二进制的表达形式:(1位十六进制扩展为4位二进制)
参考:
http://www.nowamagic.net/algorithm/algorithm_HexConversionAnalysis.php