让前端飞

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

  1. 创建类

  2. 十进制转换成二进制

  3. 任意进制之间的转换

上一篇下一篇

猜你喜欢

热点阅读