JS实现进制间的转换

目录

使用原生方法实现

toString() 可以实现十进制转其他进制

//十进制转二进制
let num = 3
console.log(num.toString(2)) // 11
console.log(num)             // 3

toString()方法可把一个 Number 对象转换为一个字符串并返回
语法:NumberObject.toString(radix)

参数 描述
radix 可选。规定表示数字的基数,使 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。

parseInt() 可以实现其他进制转十进制

// 二进制转10进制
let num = 110
console.log(parseInt(num,2)) // 6
console.log(num)             // 110

parseInt() 函数可解析一个字符串,并返回一个整数。
语法:parseInt(string, radix

参数 描述
string 必须,要被解析的字符串
radix 可选,要解析的数字的基数。2~36之间。若省略该参数或值为0,则根据string来判断数字的基数

实例:

parseInt("10");			//返回 10
parseInt("19",10);		//返回 19 (10+9)
parseInt("11",2);		//返回 3 (2+1)
parseInt("17",8);		//返回 15 (8+7)
parseInt("1f",16);		//返回 31 (16+15)
parseInt("010");		//未定:返回 10 或 8

parseInt()toString()结合可以实现各种进制之间相互转换:

parseInt(num,8);   //八进制转十进制
parseInt(num,16);   //十六进制转十进制
parseInt(num).toString(8)  //十进制转八进制
parseInt(num).toString(16)   //十进制转十六进制
parseInt(num,2).toString(8)   //二进制转八进制
parseInt(num,2).toString(16)  //二进制转十六进制
parseInt(num,8).toString(2)   //八进制转二进制
parseInt(num,8).toString(16)  //八进制转十六进制
parseInt(num,16).toString(2)  //十六进制转二进制
parseInt(num,16).toString(8)  //十六进制转八进制

手写JS实现

其他进制转十进制
从右向左各位数字乘以基数的幂次方
例如:二进制 110 = 0*2^0 + 1*2^1 + 1*2^2 = 6

function fn(a,b){
    var arr = String(a)
    var sum = 0
    var p = arr.length
    for(let i=0,len=arr.length;i<len;i++){
        sum += Number(arr[p-1])*Math.pow(b,i)
        p--
    }
    return sum
}
console.log(fn(110,2))  // 6   二进制转十进制
console.log(fn(11,8))   // 9  八进制转十进制

十进制转其他进制
除基取余,倒序排序

function Stack() {
    let items = []
    this.push = function(e){
        items.push(e)
    }
    this.pop = function(e){
        return items.pop()
    }
    this.peek = function(e){
        return items[items.length-1]
    }
    this.isEmpty = function(e){
        return items.length === 0
    }
    this.size = function(){
        return items.length
    }
    this.clear = function(){
        items = []
    }
    this.print = function(){
        console.log(items.toString())
    }
}

function fn(num,base){
    let stack = new Stack()
    let rem // 余数
    let baseString = ''
    let digits = '0123456789ABCDEF'
    while(num>0){
        rem = Math.floor(num%base)
        stack.push(rem)
        num = Math.floor(num/base)
    }
    while(!stack.isEmpty()){
        baseString += digits[stack.pop()].toString()
    }
    return baseString
}

console.log(fn(11,16)) // B
console.log(fn(3,2))   // 11
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章