js 进制转换 二、八、十、十六进制

775 阅读2分钟

前言


       计算机为什么会使用二进制?二进制是效率最高的进制吗?有一天我看到了这样的问题,好奇心的驱使下我点进了那个链接,经过好长时间的研读思索。原来二进制并不是效率最高的,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;

image.png