• 二进制,八进制,十进制,十六进制


    进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位,比如二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位,这章先只介绍整数

    一、概念介绍

    十进制数由0~9共10个数字字符组成,在十进制数的每一位上满十进一,在十进制每一位中表示最大数字为9.

    二进制数由0和1两个数字字符组成,在二进制中“逢二进一”,在二进制每一位中表示最大数字为1.

    八进制是由0~7共8个数字字符组成,在八进制中“逢八进一”,在八进制中每一位中表示最大数字为7.

    十六进制是由0~9、A、B、C、D、E、F共16个字符组成,在十六进制中“逢十六进一”,在十六进制中最大的数是F。

    二、工具转换

    1、将其他进制转换成十进制,本身我们接触到的都是以十进制为准

    >>> parseInt(377,8)
    255
    >>> parseInt(377,16)
    887
    >>> parseInt(377,2)
    NaN
    >>> parseInt(11,2)
    3

    为什么呢?
    八进制的377所代表的就是十进制数255,十六进制的377所代表的就是十进制的887
    因为表示377是以二进制表示,而二进制只能用1和0表示,所以解析出错,
    而第四个,会将2进制的11转换为10进制,自然就是3了


    在javascript中,当一个数字以0开头时,就表示这是一个八进制数,用0x前缀来表示一个十六进制,1~9的数字开头,会自动解析为十进制的整数,在parseInt中,后面不写基数的时候会默认转

    >>> var a = 0377
    undefined
    >>> a
    255
    
    >>> var b = 0x377
    undefined
    >>> b
    887
    
    >>> parseInt(0377)
    255
    >>> parseInt(0x377)
    887


    在默认表示八进制,十六进制的情况下,后面写了基数会怎么样?

    >>> parseInt(0377,2)
    NaN

    这是为什么呢?
    很简单,首先会将0377按照八进制来解析,就是255了,而255以二进制表示,而二进制只能用1和0表示,所以分析出错了

    >>> parseInt(0377,8)
    173


    首先0377会先按照八进制来解析,就是255了,再255以八进制表示转化成十进制,就是173了

    *:大家都知道parseInt是一个将字符串转换为整数的函数,还有其他细节也蛮有意思,大家自己去发现,这里先不提,这张主讲进制

    2、将十进制转换为其他进制
    大家都知道.toString()可以将所有的的数据都转换为字符串,Number.toString()函数返回表示该数字的指定进制形式的字符串,什么都不填,默认转换为十进制

    >>> var m =10
    undefined
    >>> m.toString(2)
    1010
    >>> m.toString(10)
    10
    >>> m.toString(8)
    12
    >>> m.toString(16)
    a

    三、二进制,八进制,十进制,十六进制具体怎么相互转换的

    1、十进制转二进制
    方法:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除

    例如:150转换为二进制
    150除以2得75 余0 75除以2得37 余1 37除以2得18 余1 18除以2得9 余0 9除以2得4 余1 4除以2得2 余0 2除以2得1 余0 1 余1 从最后一个数读到第一个数得到的就是最终的二进制值,所以150的二进制是10010110

    我们验证一下

    >>> parseInt(150).toString(2)
    10010110

    2、二进制转十进制
    方法:把二进制数按权展开、相加即得十进制数,位数幂的指数,2为幂的底数

    例如:10010110转换为十进制
    10010110 1*2^7+0*2^6+0*2^5+1*2^4+0*2^3+1*2^2+1*2^1+0*2^0 =128+0+0+16+0+4+2+ =150 验证一下 >>> parseInt(10010110,2) 150


    3、二进制转八进制
    方法:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)

    例如:10010110转换为八进制
    10010110
    010            010           110                           第一步,取3合1,不足补0
    0*2^2+1*2^1+0*2^0   0*2^2+1*2^1+0*2^0    1*2^2+1*2^1+0*2^0                   第二部,按权展开求和
    2             2             6                            第三部,得到八进制
    =226

    验证一下

    >>> parseInt(10010110,2).toString(8)
    226

    4、八进制转二进制
    方法:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零

    例如:226转换二进制
    226
    2            2            6
    2除以2得1  余0     2除以2得1  余0     6除以2得3   余0           八进制转二进制
    1         余1     1        余1       3除以2得1   余1
                           1          余1
    10           10          110               不足补0
    010          010          110
    10010110                                 得到最终的二进制

    验证一下

    >>> parseInt(0226).toString(2)
    10010110


    5、二进制转十六进制
    方法:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。

    例如:100101100转换十六进制
    100101100 1                0010                 1100             取4合1,不足补0 0001                0010                 1100 0*2^3+0*2^2+0*2^1+1*2^0     0*2^3+0*2^2+1*2^1+0*2^0     1*2^3+1*2^2+0*2^1+0*2^0
    1                  3                  12 ='1'+'2'+'C'

      

    验证一下

    >>> parseInt(100101100,2).toString(16)
    12c

    十六进制   十进制
    0      0
    1       1
    2      2
    3      3
    4      4
    5      5
    6      6
    7      7
    8      8
    9      9
    A      10
    B      11
    C      12
    D      13
    E      14
    F      15

    6、十六进制转二进制
    方法:十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。

    例如:12C转二进制
    12C
    1	   2	              12         转换成十进制
    1 余1     2除以2得1  余0        12除以2得6  余0
            1         余1	    6除以2得3   余0
                           3除以2得1   余1
                           1          余1
    
    1	   10	              1100 不足补0
    0001	   0010	         1100
    
    得到100101100
    

      


    验证一下

    >>> parseInt(0x12C).toString(2)
    100101100

    7、十进制与八进制与十六进制的转换
      a、简洁法-把十进制转成二进制,然后再由二进制转成八进制或者十六进制
      b、直接法-把十进制转八进制或者十六进制按照除8或者16取余,直到商为0为止

    十进制转八进制
    例如:150转8进制
    150 150除以8得18    余6 18除以8得2     余2 2          余2 =226

    验证一下

    >>> parseInt(150).toString(8)
    226

    十进制转十六进制

    例如:150转16进制
    150 150除以16得9   余6 9         余9 =96

      

    验证一下

    >>> parseInt(150).toString(16)
    96

    8、八进制或者十六进制转换成十进制

    例如: 八进制转十进制
    226
    2*8^2+2*8^1+6*8^0
    =128+16+6
    =150

      

    验证一下

    >>> parseInt(0226)
    150
    例如:十六进制转十进制
    96
    9*16^1+6*16^0
    =144+6
    =150

      

    验证一下

    >>> parseInt(0x96)
    150

    9、十六进制与八进制之间的转换
      a、他们之间的转换可以先转成二进制然后再相互转换
      b、他们之间的转换可以先转成十进制然后再相互转换


    四、总结
    1、二进制数、八进制数、十六进制数转十进制,分别乘以以各自的基数的(n-1)

    2、十进制数转二进制数、八进制数、十六进制数
    方法:整数部分用除基取余的算法,将整数拼接成一个数作为转换的最后结果

    3、二进制转八进制,二进制转16进制,
    a、取3合1,不足补0 ——> 按权展开求和 ——> 字符串相加
    b、取4合1,不足补0 ——> 按权展开求和 ——> 字符串相加

    4、十六进制转二进制,八进制转换二进制
      a、单个分开——>除2得01——>不足3补0
      b、单个分开——>除2得01——>不足4补0


    五、拓展
    javascript还支持32进制,36进制(26个英文字母 + 10个数字)

    六、作用
    1、数据加密
    数据加密,有些需要时可逆的,有些是不要求可逆的,可逆的一般称之为对称加密算法,不可逆的一般可以成为非对称加密算法

    应用:登录密码

    function jiami(code,h){
        var mycode='',i;
        for(i=0; i<code.length; i++){
            mycode+=code.charCodeAt(i).toString(h)+'_'; 
        }
        return mycode
    }
    
    function jiemi(code,h){
        var code=code.split('_'),i=0;s='';
        for(i=0; i<code.length;i++){
            s+=String.fromCharCode(parseInt(code[i],h)); 
        }
        return s;
    }
    
    jiami('这是我的密码',16)
    "8fd9_662f_6211_7684_5bc6_7801_"
    jiemi('8fd9_662f_6211_7684_5bc6_7801_',16)
    "这是我的密码        

    2、在css中,我们定义颜色
      a、使用十进制分别制定R(红),G(绿),B(蓝)的值,取值范围都为0~255。例如rgb(0,0,0)代表黑色,rgb(255,0,0)代表红色(红值达到最大值,而绿和蓝都为0值)
      b、使用十六进制数,两个数位代表一个色值,依次是R、G、B。例如#000000代表黑色,#ff0000代表红色,因为十六进制的ff就等于255

      所以,只要知道rgb,就能算出十六进制颜色,或者只要知道十六进制颜色就能知道rgb

  • 相关阅读:
    基础架构:一条SQL查询语句是如何执行的?
    常用的字符串转换日期格式
    JSONObject.fromObject(map)(JSON与JAVA数据的转换)
    ModelAndView的介绍
    Springmvc常用注解
    @PathVariable注解
    @ModelAttribute运用详解
    struts2将servlet对象注入到Action中
    为什么要继承ActionSupport?
    mysql中like用法
  • 原文地址:https://www.cnblogs.com/wzndkj/p/7607815.html
Copyright © 2020-2023  润新知