数制
1.常见的数制
十进制:逢十进一
二进制:逢二进一
八进制:逢八进一
十六进制:逢十六进一,10~15的值用字母A~F表示。
为了区别这些进制数,在数的后面加上一个字母加以区分,用B表示二进制数制;D或不带字母表示十进制数制;H表示十六进制数制。
2.进制间的转换
1.十进制转换成二进制
1.整数部分
方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
(具体用法如下图)
2.小数部分
方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分
为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例:
例1:将0.125换算为二进制
得出结果:将0.125换算为二进制(0.001)2
分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25;
第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5;
第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0;
第四步,读数,从第一位读起,读到最后一位,即为0.001。
例2,将0.45转换为二进制(保留到小数点第四位)
大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。
那么,我们可以得出结果将0.45转换为二进制约等于0.0111
上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是:
1) 十进制转换为二进制,需要分成整数和小数两个部分分别转换
2) 当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法
3) 注意他们的读数方向
因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。
2.二进制转换成十进制
方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。例
将二进制数101.101转换为十进制数。
得出结果:(101.101)2=(5.625)10
大家在做二进制转换成十进制需要注意的是
1) 要知道二进制每位的权值
2) 要能求出每位的值
注意:对于二进制转换成八进制,二进制转换成十六进制,八进制转换成十进制等低进制转换成高进制的形式,此方法都试用。
3.二进制转换成八进制
方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。
(具体用法如下图)
4.八进制转换成二进制
方法为:
1.八进制数通过除2取余法,得到二进制数。
2.对每个八进制为3个二进制,不足时在最左边补零。
(具体用法如下图)
5.二进制转换成十六进制
方法为:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。
(具体用法如下图)
6.十六进制转换成二进制
方法为:
1.十六进制数通过除2取余法,得到二进制数。
2.对每个十六进制为4个二进制,不足时在最左边补零。
(具体用法如下图)
3.有符号二进制
有符号二进制数最左边一位为符号位,0表示正数,1表示负数。有符号二进制数可以用原码,反码,补码来表示。
1.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3.补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
4.原码和补码间的转换
1.原码转换成补码
方法一:符号位不变,数值位按位取反,末位再加1。
X=-4 [X]原 = 10000100 [X]补 = 11111100B
方法二:快速求法,将负数原码的最前面的1和最后面一个之前的每一位取反。
X=-4 [X]原 = 10000100 [X]补 = 11111100B
2.补码转换成原码
方法一:符号位不变,数值位按位取反,末位再加1。
X=-4 [X]补 = 11111100B [X]原 = 10000100
方法二:快速求法,将负数补码的最前面的1和最后面一个之前的每一位取反。
X=-4 [X]补 = 11111100B [X]原 = 10000100
4.浮点型二进制
浮点数包括float和double两种类型,float占32位,double占64位。其二进制存储格式遵循IEEE754标准。以float为例:
符号位:正数为0,负数为1。
计算步骤:
1.首先计算小数的二进制。
2.将小数二进制转换成指数形式。
转换规则:将小数点移动到第一个1的右边,左移几位就是乘以2的几次幂。
3.将小数的符号位存在float的第一位,0为正数,1为负数。指数部分加上偏移量(float的偏移量为127),存入8为阶码位,将指数形式的二进制小数部分存入尾数位,如果位数不够后面用0补齐。
参考资料
【1】https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
【2】https://jingyan.baidu.com/article/495ba84109665338b30ede98.html
【3】https://www.cnblogs.com/lds85930/archive/2007/09/19/897912.html