Skip to content
On this page

进制

各种进制及其关联

目前常用的有 二进制,八进制,十进制,十六进制

二进制

由来: 计算机底层都是通过二进制来进行运算,万物基础

优势: 组成计算机系统的的逻辑电路只有两种状态(接通和断开),当计算机受到干扰也能正确分辨逻辑电路状态, 相比于十进制设计的状态电路有十种状态的电路(十种状态的电路实现会非常复杂),出现错误的几率大大减小

缺陷: 书写冗长,人手动输入会出错,所以推行了 16 进制和 8 进制,因为进制越大数的表达长度也就越短

八进制

定义: 以8为基数的计数法,采用 0, 1, 2, 3, 4, 5, 6, 7 八个数字,逢八进1

编程使用: 一个数如果要指明它采用八进制,必须在它前面加上一个 0(零),如 123 是十进制,但 0123 则表示采用八进制

十进制

就是我们最常用的数值表达方式

缺陷:

  1. 容易出现计算问题 (在js中小数的想加会出现精度问题)
  2. 因为计算机底层使用的是二进制,而二进制转化为十进制较麻烦,不够直观 (但二进制转化为 八进制 或 十六进制 十分方便, 3 位二进制可转化为 1 位八进制, 4 位二进制可转化为 1 位十六进制)

十六进制

定义: 由 0-9, A-F 组成,字母不区分大小写,与 10 进制的对应关系是:0-9 对应0-9; A-F 对应 10-15; 超过 9 的用字母 A-F

编程使用: 16进制数必须以 0x 开头,比如 0x1 表示一个16进制数,而1则表示一个十进制; 如果不使用特殊的书写形式,16进制数也会和10进制相混,随便一个数比如 9876,就看不出它是16进制或10进制

注意:
0x中的 0 是数字 0,而不是字母O
0x中的 x 不分大小写

为什么偏偏是16或8进制

为什么偏偏是16或8进制,而不其它的,诸如 9 或 20 进制呢?

因为 2、8、16,分别是 2 的 1 次方,3 次方,4 次方,这一点使得三种进制之间可以非常直接地互相转换

8 进制或 16 进制缩短了二进制数,但保持了二进制数的表达特点

二进制与十进制转换

这边只对 二进制与十进制转换 就行着重记录,其他的转换都差不多

十进制转二进制

这里的 2 是代表需要转换为2进制,默认为10

注意: num必须为数字,可以为整数与小数

js
num.toString(2)

Number(num).toString(2)

字符串转二进制

js
function strToBinary(str) {
  const result = [];
  const list = str.split('');
  for (let i = 0; i < list.length; i++) {
    if (i != 0) {
      result.push(' ');
    }
    const binaryStr = list[i].charCodeAt().toString(2);
    result.push(binaryStr);
  }
  return result.join('');
}
console.log(strToBinary('我们')) //110001000010001 100111011101100

二进制转十进制

分两种情况,一个是整数的二进制转十进制,一个是带小数的二进制转十进制

// 整数的二进制转十进制

js
const num = 1100100; // 100 的二进制表示为 1100100
const s = parseInt(num, 2) // 100

// 带小数的二进制转十进制

js
const num = '1100100.0001110000101000111101011100001010001111010111';
let [integer, decimals] = num.split('.')
integer = parseInt(integer, 2)
const sum = decimals.split('').reduce((pre, cur, index) => {
  return pre += Number(cur) * Math.pow(2, -(index + 1))
}, 0)
console.log(integer + sum); // 111.11