最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS 实现10进制转换36进制

    正文概述 掘金(YU_yu)   2021-04-17   800

    前言

    我们在平时写代码的时候偶尔会碰到进制转换的问题,常见的有2进制,8进制,10进制,16进制之间的转换,但是36进制却很少听过,这里就让我们用JS来简单尝试一下36进制的实现吧

    思考

    36进制数的构成

    在开始前,我们需要先理清楚36进制的数字组成,这样我们才能对36进制数有一个清晰的认识以及后续对数字的转化。我们都知道,16进制数是由 0-9 以及a-f 之间的字符所构成,那么36进制呢?,将 a-f 继续后推20位,显而易见,它的字母部分正好由a-z 26个英文字母构成,所以36进制数是由 0-9,a-z 所组成的

    数值准备

    理清楚它的组成后,开始思考,一个10进制数经过怎样的转化可以成为一个36进制数呢? 我们需要先准备一个有36个数值的“仓库”数组,这个数组用来存放36进制数的所有数值,当10进制数需要进行进制转换的时候,根据数值进入这个仓库取出36进制数的值,在仓库中,0-9代表36进制数的0-9,10-35代表36进制数的a-z。代码如下

    function getNums36() {
      var nums36 = [];
      for(var i = 0; i < 36 ; i++) {
        if(i >= 0 && i <= 9) { // 存入0-9的数值
          nums36.push(i) 
        } else {  // 存入a-z的数值
          nums36.push(String.fromCharCode(i + 87));  // ASCII码转换
        }
      }
      console.log(nums36,'--------');  // 检查仓库的值
      return nums36; 
    }
    
    

    JS 实现10进制转换36进制

    实现

    仓库构建好后,我们开始分解进制转化的过程。

    1. 首先对传入的10进制数进行检测,先进行浮点数判断,由于这里不讨论浮点数的进制转换,所以直接返回。其次,进行负数的检测和处理,如果 n 为负数,调用Math.abs()方法将 n 转化为正数。

    2. 检测完成后,开始进行转换

    设立一个while循环,while内部首先对 n 值做36的取余处理,得到res,

    var res = n % 36;

    这里是要获得这个10进制数转换为36进制数的最低位的值,将res抛入仓库中,取得36进制对应的数值,用unshift存入arr首位。

    arr.unshift(nums36[res]);

    最低位处理完后,我们需要对这个数进行进位,处理更高位数的值

    n = parseInt(n/36);
    

    至此,完成一轮循环

    我们用while不断对 n 进行 res 的数值取余并不断进位,最后,可以将10进制数转化为36进制数

    注意,此时记得将之前设置的neg的负数判断载首位加上

    arr.unshift(neg)
    

    最后,返回36进制数

    return arr.join("");
    

    代码

    // 提供36位的表达 0-9 a-z
    function getNums36() {
      var nums36 = [];
      for(var i = 0; i < 36 ; i++) {
        if(i >= 0 && i <= 9) {
          nums36.push(i)
        } else {
          nums36.push(String.fromCharCode(i + 87));
        }
      }
      return nums36;
    }
    function scale36(n) {
      // 单独的功能函数
      // 16进制数: 0-9  a-f    36进制数: 0-9  a-z   
      const arr = [];
      var nums36 = getNums36();
      // 36 10
      if(!Number.isInteger(n)){//浮点数判断,目前不支持小鼠
        console.warn('不支持小数转换');
        return n;
      } 
      var neg = '';
      if(n < 0){//对负数的处理
          neg = '-';
          n = Math.abs(n)
      }
      while(n) {
        var res = n % 36;
        console.log(res,'+++++++');
        arr.unshift(nums36[res]);
        // 进位
        n = parseInt(n/36);
        console.log(n,'---------');
      }
      arr.unshift(neg)
      return arr.join("");
    
    }
    
    console.log(scale36(20)); // 10
    

    扩展

    7进制数的实现

    这套模板同样适用于10进制对其他进制的转换,我们只需要修改一下仓库的数值,这里以一道LeetCode的7进制题目为例

    504. 七进制数

    给定一个整数,将其转化为7进制,并以字符串形式输出。

    示例 1:

    先准备7进制数的数值仓库

    function getNums7() {
      var nums7 = [];
      for(var i = 0; i < 7 ; i++) {
        
          nums7.push(i)
       
      }
      return nums7;
    }
    

    再对取余的数值以及进位进行修改,就可以完成模板复用了

    var res = n % 7;
    n = parseInt(n/7);
    

    代码

    
    function getNums7() {
      var nums7 = [];
      for(var i = 0; i < 7 ; i++) {
        
          nums7.push(i)
       
      }
      return nums7;
    }
    var convertToBase7 = function(num) {
      // 单独的功能函数
      
      const arr = [];
      var nums7 = getNums7();
      var neg = '';
      if(num < 0){//对负数的处理
          neg = '-';
          num = Math.abs(num)
      }
      if(num == 0) {
          return  num + "";
      }
      
      while(num) {
        var res = num % 7;  // 对高位数据进行截取
        arr.unshift(nums7[res]);  
        // 进位
        num = parseInt(num/7); 
      }
      arr.unshift(neg);
      return arr.join("");
    
    }
    

    小结

    从这个例子可以看出,只要稍加修改,我们就可以举一反三完成10进制对其他进制的随意转换,核心在于 res 的取余以及仓库数值的构建,我们通过不断进位和while循环,最终就可以拿到我们想要的进制数


    起源地下载网 » JS 实现10进制转换36进制

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元