JavaScript 各种进制间的转换

十进制与十六进制的转换

十进制转十六进制

//number.toString(radix);
//radix范围2~36,不写就是十进制
var num = 255;
console.log(num.toString(16));// 十进制转十六进制
console.log(num.toString(16).toUpperCase());// 十进制转十六进制,再转大写

十六进制转十进制

//parseInt(string, radix)
//radix范围2~36,不写就是十进制
var str = "FF";
console.log(parseInt(str, 16));//十六进制转十进制
var str1 = "12";
console.log(parseInt(str1));//字符串转十进制

十进制与二进制的转换

十进制转二进制

var decimalNum = 123;
console.log(decimalNum.toString(2));  // "1111011"
var decimalFloatNumber = 123.125;
console.log(decimalFloatNumber.toString(2));  // "1111011.001" 小数部分也可以直接得到

二进制转十进制

若二进制数只有整数部分,可直接用下列方式进行转换

var str = "1111011";
console.log(parseInt(str, 2));	// "123",二进制转十进制

若二进制数包含小数部分,用上述方法会将小数部分舍弃,因此要将整数部分和小数部分分别进行转换,最后合并为十进制数,方法如下

var binaryFloatNum = 1111011.111;
var binaryFloatNumStr = binaryFloatNum.toString();	//先将二进制数转为字符串
console.log(binaryFloatNumStr);  // "1111011.111"
var binaryFloatNumArr = binaryFloatNumStr.split(".");
console.log(binaryFloatNumArr);  // ["1111011", "111"]	//以小数点为分隔符,获取整数部分和小数部分

var binaryFloatPartStr = binaryFloatNumArr[1];  //  "111",binaryFloatPartStr为表示小数部分的字符串
var binaryFloatPartArr = binaryFloatPartStr.split("");  //  ["1", "1", "1"],将小数部分的每一位存储在数组中

/**
* 将 binaryFloatPartArr 数组中的每项转换为对应的小数部分的十进制数
* @param decimalArray 二进制小数部分中由小数各位组成的数组
*/

//遍历小数位数组,每一位乘以2的(-index-1)次幂,得到二进制小数位的十进制表示
function eachBinaryFloatPartToDecimal (binaryFloatPartArr) {
    return binaryFloatPartArr.map((currentValue, index) => {
        return Number(currentValue) * Math.pow(2, (-(index + 1)));
    })
}

var eachDecimalFloatPartNum = eachBinaryFloatPartToDecimal(["1", "1", "1"]);
console.log(eachDecimalFloatPartNum);  // [0.5, 0.25, 0.125]

/**
* 将 binaryFloatPartArr 数组中的每项转换为对应的小数部分的十进制数
* @param decimalArray 二进制小数部分中由小数各位组成的数组
*/

//将eachDecimalFloatPartNum中的每一项进行累加得到decimalFloatPartNum
var decimalFloatPartNum = eachDecimalFloatPartNum.reduce((accumulator, currentValue) => {return accumulator + currentValue;})
console.log(decimalFloatPartNum);  // 0.875

完整代码

/**
* 将二进制小数部分转换为十进制数
* @param binaryFloatPartArr 二进制小数部分中由小数各位组成的数组
*/
function eachBinaryFloatPartToDecimal(binaryFloatPartArr) {
    return binaryFloatPartArr.map((currentValue, index) => {
        return Number(currentValue) * Math.pow(2, (-(index + 1)))
    })
}

/**
* 将二进制小数(包含整数部分和小数部分)转换为十进制数
* @param binaryNum 二进制数(可能是整数,也可能是小数)
*/
function binaryFloatToDecimal(binaryNum) {
    // 如果该二进制只有整数部分则直接用 parseInt(string, radix) 处理
    if (Number.isInteger(binaryNum)) {
        return parseInt(binaryNum, 2);
    } else {
        var binaryFloatNumArr = binaryNum.toString().split(".");

        // 将二进制整数部分转换为十进制数
        var binaryIntParStr = binaryFloatNumArr[0];
        var decimalIntPartNum = parseInt(binaryIntParStr, 2);

        // 将二进制小数部分转换为十进制数
        var binaryFloatPartArr = binaryFloatNumArr[1].split("");
        var eachDecimalFloatPartNum = eachBinaryFloatPartToDecimal(binaryFloatPartArr);
        var deciamlFloatPartNum = eachDecimalFloatPartNum.reduce((accumulator, currentValue) => { return accumulator + currentValue; })
        return decimalIntPartNum + deciamlFloatPartNum;		//整数部分与小数部分相加得到转换后的十进制小数
    }
}

console.log(binaryFloatToDecimal(1111011.111));  // 123.875
console.log(binaryFloatToDecimal(1111011));  // 123
console.log(binaryFloatToDecimal(0.111));  // 0.875

二进制与十六进制的转换

二进制转十六进制

十六进制转二进制

若十六进制数不超过13位,可以直接用自带方法,先将十六进制转为十进制再由十进制转为二进制

var hexNum = 125adf8;
var hexStr = hexNum.toString(16);	//将十六进制数转为字符串
console.log(parseInt(hexStr,16).toString(2));	// "1001001011010110111111000",先将十六进制数字符串表示转为十进制数,再将十进制数转为二进制数的字符串表示

若十六进制数超过13位,使用上述方法会丢失精度,为了不丢失精度,可使用以下方法

function hex_to_bin(str) {
    let hex_array = 
    [
    {key:0,val:"0000"},{key:1,val:"0001"},{key:2,val:"0010"},{key:3,val:"0011"},
    {key:4,val:"0100"},{key:5,val:"0101"},{key:6,val:"0110"},{key:7,val:"0111"},
    {key:8,val:"1000"},{key:9,val:"1001"},{key:'a',val:"1010"},{key:'b',val:"1011"},
    {key:'c',val:"1100"},{key:'d',val:"1101"},{key:'e',val:"1110"},{key:'f',val:"1111"}
    ]

    let value=""
    for(let i=0;i<str.length;i++){
        for(let j=0;j<hex_array.length;j++){
            if(str.charAt(i).toLowerCase()== hex_array[j].key){
                value = value.concat(hex_array[j].val)
                break
            }
        }
    }
    console.log(value)
    return value
}

二进制转十六进制

function bin_to_hex(str) {
    let hex_array = 
    [
    {key:0,val:"0000"},{key:1,val:"0001"},{key:2,val:"0010"},{key:3,val:"0011"},
    {key:4,val:"0100"},{key:5,val:"0101"},{key:6,val:"0110"},{key:7,val:"0111"},
    {key:8,val:"1000"},{key:9,val:"1001"},{key:'a',val:"1010"},{key:'b',val:"1011"},
    {key:'c',val:"1100"},{key:'d',val:"1101"},{key:'e',val:"1110"},{key:'f',val:"1111"}
    ]
    let value = ''
    let list=[]
    console.log(str)
    if(str.length%4!==0){
        let a = "0000"
        let b=a.substring(0,4-str.length%4)
        str = b.concat(str)
    }
    console.log(str)
    while (str.length > 4) {
        list.push(str.substring(0, 4))
        str = str.substring(4);
    }
    list.push(str)
    console.log(list)
    for(let i=0;i<list.length;i++){
        for(let j=0;j<hex_array.length;j++){
            if(list[i]==hex_array[j].val){
                value = value.concat(hex_array[j].key)
                break
            }
        }
    }
    console.log(value)
    return value
}

【参考文章】
js 十六进制转换二进制 二进制转十六进制 异或算法
JS实现十进制与二进制的互相转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值