zoukankan      html  css  js  c++  java
  • 二进制,八进制,十进制,十六进制

    进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位,比如二进制是逢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

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/wzndkj/p/7607815.html
Copyright © 2011-2022 走看看