前言
计算机为什么会使用二进制?二进制是效率最高的进制吗?有一天我看到了这样的问题,好奇心的驱使下我点进了那个链接,经过好长时间的研读思索。原来二进制并不是效率最高的,e进制才是,但因为逻辑电路的联通与关闭,Boolean的true和false刚好对应,更加方便,所以才会使用二进制。就像人类一样,有十根手指,所以我们也就选择了十进制。 那么问题来了,有二进制,又有十进制,还有八进制,十六进制,自然就会有转换问题,作为一枚爱折腾的程序员来说,干就完了
二、八、十六进制转十进制
先做几道题吧,解解闷
1、B(111) = D( ? )
2、O(12) = D( ? )
3、H(2b) = D( ? )
想必大家应该都会下面这种方式来算
1、1 + 1x2 + 1x4 = 7
2、2 + 1x8 = 10
3、12 + 2x16 = 44
找规律
对于 s 进制数 abcde 转十进制有着共同的计算方式
result = e*s^0 + d*s^1 + c*s^2 + b*s^3 + a*s^4;
话不多说,上代码
/**
* @description 二、八、十六进制转十进制
* @param {Number} sourceNum 待转换数
* @param {Number} base 进制数
* @returns
*/
function BOHToD(sourceNum, base) {
if(!sourceNum || !base) return console.log("参数有误");
const numMap = {
a: 10,
b: 11,
c: 12,
d: 13,
e: 14,
f: 15
}
const strList = String(sourceNum).split("");
const l = strList.length;
let sum = 0;
strList.forEach((v, i) => {
sum += (numMap[v] || v) * (base ** (l - i - 1));
});
return sum;
}
十进制转二、八、十六进制
老规矩,上题解解闷
1、D(7) = B( ? )
2、D(10) = O( ? )
3、D(44) = H( ? )
咱就是说,应该这么算
1、答:111,解法如下
---> 7 / 2 = 3 ······ 1
---> 3 / 2 = 1 ······ 1
---> 1 / 2 = 0 ······ 1
2、答:12,解法如下
---> 10 / 8 = 1 ······ 2
---> 1 / 8 = 0 ······ 1
3、答:2b,解法如下
---> 44 / 16 = 2 ······ 12(b)
---> 2 / 16 = 0 ······ 2
找规律
对于十进制数p转q进制有着共同的计算方式
执行 n 次 p%q 直至 p/q = 0
话不多说,上代码
/**
* @description 十进制转二、八、十六进制
* @param {Number} sourceNum
* @param {Number} base
* @returns
*/
function DToBOH(sourceNum, base) {
const numMap = {
10: "a",
11: "b",
12: "c",
13: "d",
14: "e",
15: "f"
}
let result = [];
while(sourceNum / base) {
result.unshift(sourceNum%base);
sourceNum = Math.floor(sourceNum / base);
}
return result.map(i => numMap[i] || i).join("");
}
结语
进制转换就这么被搞定了,妈妈再也不用担心我的进制转换了
致敬每一个前端coder;Respect;