常用的进制

179 阅读2分钟

常用的进制

  • 2进制:0  1

  • 8进制:0~7

  • 10进制:0~9 (我们平时写代码,写出来的值都是10进制的)

  • 16进制:0~9  A-F

  • ....

如果我们写的值是以“0x”开头的,浏览器认为其是16进制,默认帮我们转换为10进制进行处理;如果写的值是以“0”开始的,浏览器认为其是8进制,也帮助我们默认转换为10进制,剩余写的值,都是按照10进制算的,但是不论咋样,计算机最后都是按照2进制进行存储。

JS使用number类型表示数字(整数和浮点数),遵循 IEEE-754 标准 通过64位二进制值来表示一个数字

https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html
第0位:符号位,0表示正数,1表示负数 S
第1位到第11位「11位指数」:储存指数部分 E
12位到第63位「52位尾数」:储存小数部分(即有效数字)F
注:尾数部分在规约形式下第一位默认为1(省略不写)

十进制decimal 转 二进制binary

整数转二进制

用十进制的值一直除以2,直到商为0结束,把每一次取到的余数,从末尾到开始串起来即可。

[number].toString([radix]); 把一个十进制数字转换为[radix]进制的字符串,如果不写[radix],默认是10进制

浮点数转二进制

用十进制浮点数乘以2,每一次取整数部分,把剩下的小数部分继续乘以2...直到乘积是1,没有小数为止。

很多时候会出现无限循环,但是计算机存储二进制最长64位,超出的部分会自动去掉。换句话说,就是计算机底层储存的浮点数的二进制值不一定准确,有可能是省略后的结果。

有一个特例如下:

console.log(0.1 + 0.2 == 0.3);//false

console.log(0.1+0.2);
//0.30000000000000004 != 0.3 因此fasle

console.log(0.1 + 0.3 == 0.4);//true

浏览器最多能储存16位十进制

上面例子的解决方法:浮点数转化为整数,即两个浮点数都乘以一个相同的系数,然后再除以这个系数

console.log(((0.1*10) + (0.2*10))/10);

不同的进制转十进制

  • 二进制(0 1)转十进制

    • 如:111011   1*2^5+1*2^4+1*2^3+0*2^2+1*2^1+1*2^0
  • 八进制(0~7)转十进制

    • 如:072         0*8^2+7*8^1+2*8^0=58
  • 十六进制(09 AF)转十进制

    • AF:1015
    • 16进制数,一般会以’0x‘开头,如:0x16  1*16^1+6*16^2=22  0x只是一个标识
    • 其他进制如3进制、4进制等转10进制计算方法与上述相同。