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