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

时间:2024-03-12 19:37:56

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