手撸js进制转换

js进制转换

思想根据原生方法tostring()

栈(后进先出)

因为刚好有空看了一下数据结构和算法,书中写到栈的应用,就拿来学习了一下,
很简单的实现了一个栈

/**
 * Stack 栈(后进先出)
 */
;(function(w){
	let items = new WeakMap();
	class Stack{
		constructor(){
			items.set(this,[]);
		}
		//追加
		push(ele){
			items.get(this).push(ele);
		}
		//删除
		pop(){
			let ele = items.get(this).pop();
			return ele;
		}
		//读取最后一个元素
		peek(){
			return items.get(this)[this.items.length-1];
		}
		//清除
		clear(){
			items.set(this,[]);	
		}
		//判断栈是否为空
		isEntry(){
			return items.get(this).length === 0;
		}
	}
	//暴露类
	w.Stack = Stack;
})(window)

其实以下的栈用数组代替也可以

10进制如何转其他进制呢

//全局变量
const stack = new Stack();
const binStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZ';
Number.prototype.DECto = function(bin=10) {//如果没有传参默认是10转10进制
	let remainder,result='',number = this;
	if(!(bin>=2 && bin<=36)){//参数检验
		throw new RangeError('DECto() radix argument must be between 2 and 36');
	}
	//入栈
	while(number>0){
		remainder = Math.floor(number % bin);
		stack.push(remainder);
		number = Math.floor(number/bin);
	}
	//出栈
	while(!stack.isEntry()){
		result += binStr[stack.pop()];
	}
	return result;
}

其他进制转10进制

//字符串类型添加2-36进制转10进制
	String.prototype.toDEC = function(bin=10){
		let remainder,number = this;
		if(!(bin>=2 && bin<=36)){
			throw new RangeError('DECto() radix argument must be between 2 and 36');
		}
		let binArr = binStr.slice(0,bin),//字符取值范围
				sum = 0,//总值
				length = number.length;//数的长度
		for(let i=length-1; i>=0; i--){
			let value = binStr.indexOf(number[i].toUpperCase());
			sum += bin**(length-i-1)*value;//转10进制算法,(位数值*(进制数^(位数-1)))
		}
		return sum;
	}

演示

10进制转其他
在这里插入图片描述
其他转10进制
在这里插入图片描述
其他进制转其他进制
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值