JavaScript 任意进制转换算法
2019-04-11 本文已影响0人
贵在随心
这里需要借助 JavaScript 中 栈 这个数据结构,栈的相关知识如下图:
一、创建类[1]
首先需要创建一个 stack.js 文件来存储 Stack(栈)类,如下代码:
export default class Stack {
constructor() {
this.count = 0;
this.items = {};
}
push(element) {
this.items[this.count] = element;
this.count++;
}
pop() {
if (this.isEmpty()) {
return undefined;
}
this.count--;
const result = this.items[this.count];
delete this.items[this.count];
return result;
}
peek() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.count - 1];
}
isEmpty() {
return this.count === 0;
}
size() {
return this.count;
}
clear() {
this.items = {};
this.count = 0;
}
toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[0]}`;
for (let i = 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}
二、十进制转换成二进制[2]
我们来看看如何把十进制转换成二进制?
看代码中的注释说明:
// decNumber 为传入的十进制数
function decimalToBinary(decNumber) {
// 使用 stack.js 中 Stack 类
const remStack = new Stack();
let number = decNumber;
let rem;
let binaryString = '';
while (number > 0) {
// 获得余数为2的数
rem = Math.floor(number % 2);
// 把2的余数放入栈中
remStack.push(rem);
// 把传入的十进制数与2整除
number = Math.floor(number / 2);
}
while (!remStack.isEmpty()) {
// 用 pop 方法把栈中的元素都移除,再组成一个字符串
binaryString += remStack.pop().toString();
}
return binaryString;
}
// test
console.log(decimalToBinary(33)); //100001
console.log(decimalToBinary(100)); //1100100
注:为啥使用 Math.floor => javascript 中的数字类型不会区分数字是整数还是浮点数。
三、任意进制之间的转换[3]
为了让进制转换更灵活,需要改动一下函数,如下代码:
// decNumber 为传入的要转换的十进制数字
// base: 要转成的进制类型
function baseConverter(decNumber, base) {
// 创建 Stack 类
const remStack = new Stack();
// 定义一个进制位数,这里设置了 36 位进制,可自定义位数
const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let number = decNumber;
let rem;
let baseString = '';
if (!(base >= 2 && base <= 36)) {
return '';
}
while (number > 0) {
rem = Math.floor(number % base);
remStack.push(rem);
number = Math.floor(number / base);
}
while (!remStack.isEmpty()) {
// 对栈中的数字做转化
baseString += digits[remStack.pop()];
}
return baseString;
}
// test
console.log(baseConverter(1314, 2)); //10100100010
console.log(baseConverter(1314, 8)); //2442
console.log(baseConverter(1314, 16)); //522
console.log(baseConverter(1314, 20)); //35E
console.log(baseConverter(1314, 30)); //1DO
console.log(baseConverter(1314, 35)); //12J