zoukankan      html  css  js  c++  java
  • 数制

    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

  • 相关阅读:
    python学习之【第十一篇】:Python中的文件操作
    vue2-preview引用时报错解决办法
    原生JS封装_new函数,实现new关键字的功能
    vue+element UI + axios封装文件上传及进度条组件
    Python面试题汇总
    在vue中如何使用axios
    tp5 修改默认的分页url
    jq判断是PC还是手机端的方法
    php 通过curl header传值
    windows 安装memchched和memcache教程
  • 原文地址:https://www.cnblogs.com/lty1661489001/p/11575275.html
Copyright © 2011-2022 走看看