JavaScript 任意進制轉換算法

這里需要借助 JavaScript 中 這個數(shù)據(jù)結構,棧的相關知識如下圖:

一、創(chuàng)建類[1]

首先需要創(chuàng)建一個 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 為傳入的十進制數(shù)
function decimalToBinary(decNumber) {
  // 使用 stack.js 中 Stack 類
  const remStack = new Stack();
  let number = decNumber;
  let rem;
  let binaryString = '';

  while (number > 0) {
    // 獲得余數(shù)為2的數(shù)
    rem = Math.floor(number % 2);
    // 把2的余數(shù)放入棧中
    remStack.push(rem);
    // 把傳入的十進制數(shù)與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 中的數(shù)字類型不會區(qū)分數(shù)字是整數(shù)還是浮點數(shù)。

三、任意進制之間的轉換[3]

為了讓進制轉換更靈活,需要改動一下函數(shù),如下代碼:

// decNumber 為傳入的要轉換的十進制數(shù)字
// base: 要轉成的進制類型
function baseConverter(decNumber, base) {
  // 創(chuàng)建 Stack 類
  const remStack = new Stack();
  // 定義一個進制位數(shù),這里設置了 36 位進制,可自定義位數(shù)
  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()) {
    // 對棧中的數(shù)字做轉化
    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. 創(chuàng)建類 ?

  2. 十進制轉換成二進制 ?

  3. 任意進制之間的轉換 ?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容