进制
1、常用进制
十进制
从小学开始我们就学习了数数,我们对0~9这十个数字很熟悉。我们管小数点前的第一位叫做个位,每个1代表1,第二位叫做十分位,每个1代表10,第三位叫做百分位,每个1代表100,以此类推,无穷无尽。
我们计一个大于9的整数,就要用到十分位,因为一个位只能容纳从0~9这十个数字,多出来的就需要向高位进1,这种计数方式就是十进制。
我们说的个位,十分位,百分位就是位,在一个位上,每个1代表的数字大小,就是位权,简称权。如果一个数的计数方式是n进制,我们就称n是这个数的基。这个数的大小也就是
其中k是整数部分的总位数,g是小数部分的总位数,D是每一确定位上的值。
拿十进制为例,比如一个数字520.1214
二进制
在计算机内部,数据都是以二进制的形式存储的,二进制是学习编程必须掌握的基础。
用理解十进制的方法,我们可以理解任意进制。
二进制,就是一种只用0和1计数方式,当前位满2就向高位进1,同样,做减法时当前位如果不够减了,就需要向高位借1,高位的1相当于相邻低位的2。

八进制
八进制用0-7八个数字计数,基数是8,逢8进位,同样,做减法时当前位不够减时,向高位借1,高位的1相当于相邻低位的8。
例如:

十六进制
十六进制中,用A来表示10,B表示11,C表示12,D表示13,E表示14,F表示15,因此有 0~F 共16个数字,基数为16,加法运算时逢16进1,减法运算时借1当16。例如,数字 0、1、6、9、A、D、F、419、EA32、80A3、BC00 都是有效的十六进制。
需要注意的是,十六进制不区分大小写,也就是说,BC00和bc00是同一个数字。

2、进制相互转换
1、其它进制转十进制
按照最开始展示的公式,将其它进制转换成十进制很容易。
例如:
-
二进制:1001 = 1×23 + 0×22 + 0×21 + 1×20 = 8 + 0 + 0 + 1 = 9(十进制)
-
二进制:101.1001 = 1×22 + 0×21 + 1×20 + 1×2-1 + 0×2-2 + 0×2-3 + 1×2-4 = 4 + 0 + 1 + 0.5 + 0 + 0 + 0.0625 = 5.5625(十进制)
-
八进制:302 = 3×82 + 0×81 + 2×80 = 192 + 0 + 2 = 194(十进制)
-
八进制:302.46 = 3×82 + 0×81 + 2×80 + 4×8-1 + 6×8-2 = 192 + 0 + 2 + 0.5 + 0.09375= 194.59375(十进制)
-
十六进制:EA7 = 14×162 + 10×161 + 7×160 = 3751(十进制)
2、十进制转其它进制
整数部分
十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是:
-
将 N 作为除数,用十进制整数除以 N,可以得到一个商和余数;
-
保留余数,用商继续除以 N,又得到一个新的商和余数;
-
仍然保留余数,用商继续除以 N,还会得到一个新的商和余数;
-
……
-
如此反复进行,每次都保留余数,用商接着除以 N,直到商为 0 时为止。
把先得到的余数作为 N 进制数的低位数字,后得到的余数作为 N 进制数的高位数字,依次排列起来,就得到了 N 进制数字。
小数部分
十进制小数转换成 N 进制小数采用“乘 N 取整,顺序排列
-
用 N 乘以十进制小数,可以得到一个积,这个积包含了整数部分和小数部分;
-
将积的整数部分取出,再用 N 乘以余下的小数部分,又得到一个新的积;
-
再将积的整数部分取出,继续用 N 乘以余下的小数部分;
-
……
-
如此反复进行,每次都取出整数部分,用 N 接着乘以小数部分,直到积中的小数部分为 0,或者达到所要求的精度为止。
把取出的整数部分按顺序排列起来,先取出的整数作为 N 进制小数的高位数字,后取出的整数作为低位数字,这样就得到了 N 进制小数。
例如:
我们想将一个十进制数字36926转换成八进制,我们将这个数除以8,得商4615余6,这个6就是八进制小数点前的第一位。我们继续将4615除以8,得商576余数7,这个7就是小数点前第二位。以此类推。576继续除以8,得商72余数0,72继续除以8,得商9余数0,9继续除以8,得商1余数1,1继续除以8,得商0余数1.
如此一来,就得到了这个数的八进制表示方式110076。
如果我们想将一个十进制小数0.930908203125转换成八进制,首先将这个数乘8,得到一个数字7.447265625,我们将整数7取出来,它就是八进制的小数点后第一位,将去掉整数7之后的小数0.447265625继续乘8,得到3.578125,整数3是小数点后第二位,继续将小数部分乘8,得4.625,将0.625乘8,得到5,至此小数部分全部乘尽。
如此一来,就得到了这个数得八进制表示方式0.7435
3、为什么这样会是正确的?
为什么这样就能转换呢?基于什么原理呢?我们接下来用一些数学方法来证明它。
【我们把整数和小数分开算,因为其转换规则不同,证明的时候我们也分开证明,如果一个数字既有整数部分,又有小数部分,就将其分开换算,再加一起就可以了。】
整数部分
假设一个十进制整数a,我们将它转换成N进制计数法,假设转换完成后,它整数部分共有k位,每一位上的数值从右往左分别是 ,那么这个数可以写为:
我们要做的就是求出每一位上的。按照前面讲过的方法,将上式除N取余。得
去哪了呢?前面的都是可以被整除的,
就成了余数,所以这样我们看到余数的值是多少,就知道小数点前面的第一位数值
是多少了。去掉每一步的余数,再除以N。
按照此步骤反复执行,就依次将全都求出来了。
小数部分
假设一个十进制小数a,我们将它转换成N进制计数法,设转换完成后共有k位小数,每一位上的数值从左往右分别是,那么这个数可以表示为:
我们要做的就是求出每一位上的。按照前面讲过的方法,将上式乘N取整。得
可以看到,整数部分就是,我们将整数取出,继续乘N,反复执行,就依次将
全都求出来了。
注意,十进制小数转换成其他进制小数时,结果有可能是一个无限位的小数。例如0.51等。
4、二进制、八进制和十六进制的转换方法
以上换算方法适用于所有进制之间的换算,但是这样很麻烦,有时候用更简单的方法。
每三位二进制数字可以转换为一位八进制数字,每四位二进制数字可以转换为一位十六进制数字,所以我们常用一下方法进行转换。
比如我们将一个二进制数字10111100011转换成八进制1343:

注意,换算时必须始终保持小数点对齐,整数部分不足时在高位补零,当有小数时,小数部分不足时往低位补零。
例如:
二进制数字1011.0111换算成八进制数13.74:

十六进制与二进制之间的换算道理是一样的,唯一的区别是十六进制的每一位对应二进制的四个位。
关注微信公众号 axxd_lz后台回复【C语言】领取视频和电子书
网友评论