美文网首页让前端飞
JavaScript 任意进制转换算法

JavaScript 任意进制转换算法

作者: 贵在随心 | 来源:发表于2019-04-11 15:54 被阅读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. 任意进制之间的转换

    相关文章

      网友评论

        本文标题:JavaScript 任意进制转换算法

        本文链接:https://www.haomeiwen.com/subject/rdutwqtx.html