进制
各种进制及其关联
目前常用的有 二进制,八进制,十进制,十六进制
二进制
由来: 计算机底层都是通过二进制来进行运算,万物基础
优势: 组成计算机系统的的逻辑电路只有两种状态(接通和断开),当计算机受到干扰也能正确分辨逻辑电路状态, 相比于十进制设计的状态电路有十种状态的电路(十种状态的电路实现会非常复杂),出现错误的几率大大减小
缺陷: 书写冗长,人手动输入会出错,所以推行了 16 进制和 8 进制,因为进制越大数的表达长度也就越短
八进制
定义: 以8为基数的计数法,采用 0, 1, 2, 3, 4, 5, 6, 7
八个数字,逢八进1
编程使用: 一个数如果要指明它采用八进制,必须在它前面加上一个 0(零),如 123 是十进制,但 0123 则表示采用八进制
十进制
就是我们最常用的数值表达方式
缺陷:
- 容易出现计算问题 (在js中小数的想加会出现精度问题)
- 因为计算机底层使用的是二进制,而二进制转化为十进制较麻烦,不够直观 (但二进制转化为 八进制 或 十六进制 十分方便, 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必须为数字,可以为整数与小数
num.toString(2)
Number(num).toString(2)
字符串转二进制
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
二进制转十进制
分两种情况,一个是整数的二进制转十进制,一个是带小数的二进制转十进制
// 整数的二进制转十进制
const num = 1100100; // 100 的二进制表示为 1100100
const s = parseInt(num, 2) // 100
// 带小数的二进制转十进制
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