【问题标题】:How do you convert numbers between different bases in JavaScript?如何在 JavaScript 中的不同基数之间转换数字?
【发布时间】:2010-11-23 04:07:25
【问题描述】:

我想在不同的基数之间转换数字,例如十六进制和十进制。

示例:如何将十六进制的8F 转换为十进制?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    API

    从十六进制字符串转换为数字:

    parseInt(string, radix)
    
    • 字符串:必需。要解析的字符串

    • 基数:可选。表示要使用的数字系统的数字(从 2 到 36)

    将数字转换为十六进制字符串:

    NumberObject.toString(radix)
    
    • 基数:可选。指定您希望数字显示为的基数。

    基数值示例:

    • 2 - 数字将显示为二进制值
    • 8 - 数字将显示为八进制值
    • 16 - 数字将显示为十六进制值

    示例用法

    整数值转十六进制:

    var i = 10;
    console.log( i.toString(16) );

    十六进制字符串转整数值:

    var h = "a";
    console.log( parseInt(h, 16) );

    整数转十进制:

     var d = 16;
     console.log( d.toString(10) );

    【讨论】:

    • 这样更好。反向。
    • 我没有看到第一个如何转换为十六进制。你能解释一下吗?此外,第二个将导致十六进制而不是标记的十进制。
    • @Russ Cam:第一个将基数作为参数 - 十六进制是基数 16 - 并返回该数字在该基数中的表示形式的字符串。你对第二个不正确 - 它确实会产生一个十进制值。
    • @Wahnfrieden - 我误解了你的意思。我现在很清楚:)
    • 这对于大于 36 的碱基会失败,因为 toString 会抛出 RangeError。大的碱基显然没有意义来表示为字符。
    【解决方案2】:

    我来到这篇文章需要将基数从 10 转换为 62,反之亦然。虽然这里的解决方案很棒,但parseInttoString 仅支持基数 2 到 36。因此,如果有人发现自己处于与我需要基数 2 到 62 的相似位置,我已将我的解决方案粘贴在下面。

    https://gist.github.com/ryansmith94/91d7fd30710264affeb9

    function convertBase(value, from_base, to_base) {
      var range = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/'.split('');
      var from_range = range.slice(0, from_base);
      var to_range = range.slice(0, to_base);
      
      var dec_value = value.split('').reverse().reduce(function (carry, digit, index) {
        if (from_range.indexOf(digit) === -1) throw new Error('Invalid digit `'+digit+'` for base '+from_base+'.');
        return carry += from_range.indexOf(digit) * (Math.pow(from_base, index));
      }, 0);
      
      var new_value = '';
      while (dec_value > 0) {
        new_value = to_range[dec_value % to_base] + new_value;
        dec_value = (dec_value - (dec_value % to_base)) / to_base;
      }
      return new_value || '0';
    }

    【讨论】:

    • 浮点数有变化吗?例如。如何将1.3 转换为base 64?
    • 我个人还没有道歉。
    • 看起来某处有错误。将“111222444abcdef”从基数 16 转换为 10 并返回结果“111222444abcdf0”
    • 我感觉这可能与 JavaScript @expert 中的数字精度有关,因为该错误是由 dec_value % to_base 对大量数字引起的,但我似乎无法为较小的数字重现它.
    • @RyanSmith 你说得对,其他在线转换器也这样做。
    【解决方案3】:

    你可以试试下面的代码,它也支持任意精度数(大于2^53)。

    function convertBase(str, fromBase, toBase) {
    
        const DIGITS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
    
        const add = (x, y, base) => {
            let z = [];
            const n = Math.max(x.length, y.length);
            let carry = 0;
            let i = 0;
            while (i < n || carry) {
                const xi = i < x.length ? x[i] : 0;
                const yi = i < y.length ? y[i] : 0;
                const zi = carry + xi + yi;
                z.push(zi % base);
                carry = Math.floor(zi / base);
                i++;
            }
            return z;
        }
    
        const multiplyByNumber = (num, x, base) => {
            if (num < 0) return null;
            if (num == 0) return [];
    
            let result = [];
            let power = x;
            while (true) {
                num & 1 && (result = add(result, power, base));
                num = num >> 1;
                if (num === 0) break;
                power = add(power, power, base);
            }
    
            return result;
        }
    
        const parseToDigitsArray = (str, base) => {
            const digits = str.split('');
            let arr = [];
            for (let i = digits.length - 1; i >= 0; i--) {
                const n = DIGITS.indexOf(digits[i])
                if (n == -1) return null;
                arr.push(n);
            }
            return arr;
        }
    
        const digits = parseToDigitsArray(str, fromBase);
        if (digits === null) return null;
    
        let outArray = [];
        let power = [1];
        for (let i = 0; i < digits.length; i++) {
            digits[i] && (outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase));
            power = multiplyByNumber(fromBase, power, toBase);
        }
    
        let out = '';
        for (let i = outArray.length - 1; i >= 0; i--)
            out += DIGITS[outArray[i]];
    
        return out;
    }
    

    用法:

    console.log(convertBase("5a2a9c826c75045be9ba8fbffc80c6f25a2a9c826c75045be9ba8fbffc80c6f2",16,64));
    // Returns: 5EGD89ItghrWrGfL/O0NL9qaFO2r7k4m+CWzX/YwcrO
    
    console.log(convertBase("5EGD89ItghrWrGfL/O0NL9qaFO2r7k4m+CWzX/YwcrO",64,16));
    // Returns: 5a2a9c826c75045be9ba8fbffc80c6f25a2a9c826c75045be9ba8fbffc80c6f2
    

    基本代码已找到here,我对其进行了一些改进,使其也支持base 64。

    【讨论】:

    • 这是一个非常好的代码!不知道有没有C版的?好像没找到!
    • @Zibri,对不起,IDK。但欢迎您自行转换并在这里与他人分享。
    【解决方案4】:

    下图可能会有所帮助。请注意,要从基数 16 转换为基数 2,您需要先转换为基数 10,然后再转换为基数 2。

    【讨论】:

      【解决方案5】:

      此函数生成从 2 到 36 的任何基数的十进制数。(就像 javascript)

      但是您可以通过在 keys[] 中添加新字符来增加基数超过 36,例如小写 ["a ","b"]

      function toBase(num, radix = 10) { // only i64 numbers
        var keys = ['?', '?', 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
        if (!(radix >= 2 && radix <= keys.length)) throw new RangeError("toBase() radix argument must be between 2 and " + keys.length)
      
        if (num < 0) var isNegative = true
        if (isNaN(num = Math.abs(+num))) return NaN
      
        let output = [];
        do {
          let index = num % radix;
          output.unshift(keys[index]);
          num = Math.trunc(num / radix);
        } while (num != 0);
        if (isNegative) output.unshift('-')
        return output.join("");
      }
      
      console.log(toBase("100",2)) 

      【讨论】:

        【解决方案6】:

        嗯,我做了一个函数,可以从 10 进制转换为任何进制。 (这取决于你在数组A 中有多少个字符串,如果超过 + 10,它将用完符号),当我发现你可以用少于 10 个字符的时候,我几乎哭了那……

        添加一个书签并作为 URL 插入这个...我已经完成了很长但个人的方式。至少,我的可以使用高于36的基础。你可以自己添加更多符号,但如果你愿意,我可以为你做......

        var X = prompt("Choose your number");
        var Y = prompt("Choose your base");
        var Z = [];
        var M = -1;
        var A = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
        var B = function() {
            for (i = X; 0 < i; i = Math.floor(i / Y)) { 
                if(i % Y >= 10) { 
                    Z.push(A[i % Y - 10]);
                } else { 
                    Z.push(i % Y);
                } 
                M = M + 1;
            } 
            for (j = M; j >= 0; j--) {
                document.write(Z[j]);
            } 
        };
        
        B(); // Call function

        【讨论】:

        • 我认为您在某处出现计数错误。 100.toString(26) = "3M" 但你的会输出 "3O" (三个哦,不是三个零)
        • 这不会弹出负数。尝试将-1 转换为基础10
        • 使用 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 可以上到base64(真实的,不要和btoa/atob混淆)
        • @oooyaya 实际上,它输出“2S”,即正确答案。顺便说一句,使用 var x=100; x.toString(26);
        【解决方案7】:

        指定要用作参数的基数。

        注意:这仅适用于从基数 2-36 转换为十进制和 little 值。

        parseInt(string, radix) 
        
        parseInt("80", 10) // results in 80
        parseInt("80", 16) // results in 128
        // etc
        

        关于“小”,parseInt("6f", 32) 很好(= 207),
        但任何其他更大的也将是 207,6f16f11,...

        【讨论】:

        • @Nosredna 你是对的,但 Russ Cam 为我得到了正确的语法 parseInt - 这已经足够了。谢谢。
        • @RussCam 我没有投反对票,但我认为这是因为这个答案仅限于转换为十进制,这确实解决了给出的示例,但问题是between different bases。 (我毫不怀疑这六年来一直困扰着你。)
        【解决方案8】:

        通常我使用这个函数来转换不同的基数。

        例如,对于这两种情况,它都会返回 "11111111"convertBase("ff", 16, 2)convertBase(0xFF, 16, 2)

        var convertBase = function(val, base1, base2) {
            if (typeof(val) == "number") {
                return parseInt(String(val)).toString(base2);
            } else {
                return parseInt(val.toString(), base1).toString(base2)
            };
        }
        

        【讨论】:

          【解决方案9】:

          我编写了一个函数,用于将 JavaScript 字符串从一个基数转换为另一个基数,并将原始基数和新基数指定为参数。

          function convertFromBaseToBase(str, fromBase, toBase){
          	var num = parseInt(str, fromBase);
              return num.toString(toBase);
          }
          
          alert(convertFromBaseToBase(10, 2, 10));

          【讨论】:

          • 是的,这就是要走的路!
          【解决方案10】:

          使用 parseInt 函数:

          var noInBase10 = parseInt('8F',16);
          

          【讨论】:

            【解决方案11】:

            此函数将一个以 10 为底的数字转换为 任意底数

            function to_base(base, num) {
                const largest_power = ~~(Math.log(num) / Math.log(base));
                const result = [];
                for (let pow = largest_power; pow >= 0; pow--) {
                    const digit = ~~(num / base ** pow);
                    num -= digit * base ** pow;
                    result.push(digit);
                }
                return result;
            }
            
            to_base(2, 13) // [1, 1, 0, 1]
            to_base(10, 458) // [4, 5, 8]
            to_base(32, 1024) // [1, 0, 0]
            to_base(32, 1023) // [31, 31]
            

            如果你想使用奇怪的碱基和奇怪的字符集,这会很有用

            【讨论】:

              【解决方案12】:

              试试下面的代码,从 Slavik Meltser 的帖子优化,实现 BASE n 转换与 Base2 和 Base256 之间的所有基数组合。此代码接受三种参数来定义源和目标编号系统:

              • 按数字系统基数(例如 8)
              • 按数字系统约定名称(例如“比特币”)
              • 通过提供自定义数字作为参数(例如 ['0123456789ABCDEF'])

              您会看到一些数字系统数字已在类中进行硬编码,并且在您将基数作为参数传递时将用作默认值。 (例如 64)当不存在硬编码数字时(例如 16),将为 Base2 和 Base256 之间的所有基数分配默认数字,这在下面的自检中变得非常清楚。

              function BASE() {
                /**
                 * BASE n converter doing all the radix combinations between Base2 and Base256
                 * @param  {String}               str         input number
                 * @param  {Number|String|Array}  fromBase    input number system radix (Number, e.g. 64), convention name (String, e.g. 'Bitcoin') or range (Array)
                 * @param  {Number|String|Array}  toBASE      output number system radix (Number), convention name (String) or range (Array e.g. ['0123456789'])
                 * @return {String}                           output number
                 */
                  this.convert = function (str, fromBase, toBASE)
                  {
                    if(typeof(fromBase)=='object') { this.fromSymbols = fromBase[0] } else this.fromSymbols = this.getsymbols(fromBase);
                    if(typeof(toBASE)  =='object') { this.toSymbols = toBASE[0] } else this.toSymbols = this.getsymbols(toBASE);
                    fromBase = this.fromSymbols.length; toBASE = this.toSymbols.length;
              
                    // PARSE INPUT DIGITS ARRAY
                    for(var _a = [0], str = str.split(''); str.length > 0 && _a[_a.push(this.fromSymbols.indexOf(str.pop())) - 1] >= 0;);
                    var _d = _a.shift() + _a[_a.length-1]>=0 ? _a : null; if (_d === null) return null;
              
                    // BASE CONVERSION
                    for (var _n = 0,_a = [],_p = [1]; _n < _d.length; _n++) { _a = add(_a, mul(_d[_n], _p, toBASE), toBASE); _p = mul(fromBase, _p, toBASE) }
              
                    // PARSE OUTPUT DIGITS ARRAY
                    for (var _n = _a.length - 1, _o = ''; _n >= 0; _o += this.toSymbols[_a[_n--]]);
                    return _o.length==0?this.toSymbols[0]:_o;
                  }
              
                  this.symbols = {
                      32:function(){return this["base32hex"]},
                      36:["[0-9][A-Z]"],
                      45:function(){return this["qr-alnum"]},
                      58:function(){return this["Bitcoin"]},
                      64:["[A-Z][a-z][0-9]+/"],
                      85:function(){return this["RFC 1924"]},
                      91:["[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~\""],
                      94:["[!-~]"],
                  "geohash":  ["[0-9][b-h]jkmn[p-z]"],                      // base 32
                  "RFC 4648": ["[A-Z][2-7]"],                               // base 32
                  "base32hex": ["[0-9][A-V]"],                              // base 32
                  "qr-alnum":["[0-9][A-Z] $%*+-./:"],                       // base 45
                  "Bitcoin":  ["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],           // base 58
                  "RFC 1924": ["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]    // base 85
                  }
              
                  this.getsymbols = function(index) {
                    if(typeof(this.symbols[index])=="undefined") this.symbols[index] = index<95?this.rng(index<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,index):this.rng("[\x00-\xff]").substring(256-index,256);
                    if(typeof(this.symbols[index])=="function")  this.symbols[index] = this.symbols[index]();             // process references
                    if(typeof(this.symbols[index])=="object")    this.symbols[index] = this.rng(this.symbols[index][0]);  // process range_replace
                    return this.symbols[index];
                  }
              
                  this.rng = function(_s) {
                    var _a = _s.match(/\[.-.\]/); if(_a==null) return _s; else { _a=[_a[0].charCodeAt(1),_a[0].charCodeAt(3)];
                    return this.rng(_s.replace(RegExp("\\[(\\x"+("0"+_a[0].toString(16)).slice(-2)+"-\\x"+_a[1].toString(16)+")\\]","g")
                    ,String.fromCharCode(..." ".repeat(_a[1]-_a[0]+1).split("").map((_e,_i)=>_i+_a[0])) )) }
                  }
              
                  this.selftest = function() {
                    var _a={}; for(var _o in this.symbols) _a[_o] = this.getsymbols(_o).length; // built-in symbols
                    for(_o=2;_o<=95;_o++) _a[_o] = this.getsymbols(_o).length; _a[256]=256;     // symbol range 2-95 + 256 (96-255 is similar)
                    var _s = "",_a = Object.keys(_a).sort(function(a,b){return _a[a]-_a[b]});   // sort merged list
                    for(var _i in _a) {                                                         // iterate number systems
                      _o = {fromBase:10, toBASE:_a[_i]}; var _r = this.convert("",10,_o.toBASE)
                      _s += "\r\n\oBASE.convert(n, '"+_o.fromBase+"', '"+_o.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n"
                      for(var _n=0;_n<(this.fromSymbols.length+2);_n++) {                       // iterate numbers
                        _r = this.convert(String(_n),_o.fromBase,_o.toBASE)
                        _s += _n+(String(_n)==this.convert(_r,_o.toBASE,_o.fromBase)?">":"?")+"["+_r+"] ";
                      }
                    }
                    return _s
                  }
              
                  var add = function(x, y, base) {
                      var _m = Math.max(x.length, y.length);
                      for(var _c = _n = 0,_r = []; _n < _m || _c; _c = Math.floor(_z / base)) {
                        var _z = _c + (_n < x.length ? x[_n] : 0) + (_n < y.length ? y[_n] : 0);
                        var _n =  _r.push(_z % base);
                      }
                      return _r;
                  }
              
                  var mul = function(x, pow, base) {
                      for(var _r = x < 0 ? null : []; x > 0; x = x >> 1) {
                        if(x & 1) _r = add(_r, pow, base);
                        pow = add(pow, pow, base);
                      }
                      return _r;
                  }
              }
              

              用法:

              // quick test, convert from base45 to base32, using custom symbols for base85 and back to base45
              
              var oBASE = new BASE();
              
              var n = "THIS IS A NUMBER";                 // Base 45 code = 'qr-alnum'
              console.log(n);                             // Result: 'THIS IS A NUMBER'
              
              var n = oBASE.convert(n,"qr-alnum",32);     // Base 45 to Base 32 = 'base32hex'
              console.log(n);                             // Result: '4ONI84LCTLJ1U08G1N'
              
              var s85 = oBASE.rng("[0-9][a-z][A-Z].-:+=^!/*?&<>()[]{}@%$#"); // 32/Z85 custom symbols
              var n = oBASE.convert(n,"base32hex",[s85]); // 'base2hex' to custom Base 85 
              console.log(n);                             // Result: 'fnaxrZP)?5d[DG'
              
              var n = oBASE.convert(n,[s85],45);          // Custom Base 85 to Base 45 = 'qr-alnum'
              console.log(n);                             // Result: 'THIS IS A NUMBER'
              
              function BASE(){this.convert=function(o,r,n){this.fromSymbols="object"==typeof r?r[0]:this.getsymbols(r),this.toSymbols="object"==typeof n?n[0]:this.getsymbols(n),r=this.fromSymbols.length,n=this.toSymbols.length;var i=[0];for(o=o.split("");o.length>0&&i[i.push(this.fromSymbols.indexOf(o.pop()))-1]>=0;);var h=i.shift()+i[i.length-1]>=0?i:null;if(null===h)return null;for(var e=0,l=(i=[],[1]);e<h.length;e++)i=t(i,s(h[e],l,n),n),l=s(r,l,n);e=i.length-1;for(var m="";e>=0;m+=this.toSymbols[i[e--]]);return 0==m.length?this.toSymbols[0]:m},this.symbols={32:function(){return this.base32hex},36:["[0-9][A-Z]"],45:function(){return this["qr-alnum"]},58:function(){return this.Bitcoin},64:["[A-Z][a-z][0-9]+/"],85:function(){return this["RFC 1924"]},91:['[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~"'],94:["[!-~]"],geohash:["[0-9][b-h]jkmn[p-z]"],"RFC 4648":["[A-Z][2-7]"],base32hex:["[0-9][A-V]"],"qr-alnum":["[0-9][A-Z] $%*+-./:"],Bitcoin:["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],"RFC 1924":["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]},this.getsymbols=function(t){return void 0===this.symbols[t]&&(this.symbols[t]=t<95?this.rng(t<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,t):this.rng("[\0-ÿ]").substring(256-t,256)),"function"==typeof this.symbols[t]&&(this.symbols[t]=this.symbols[t]()),"object"==typeof this.symbols[t]&&(this.symbols[t]=this.rng(this.symbols[t][0])),this.symbols[t]},this.rng=function(t){var s=t.match(/\[.-.\]/);return null==s?t:(s=[s[0].charCodeAt(1),s[0].charCodeAt(3)],this.rng(t.replace(RegExp("\\[(\\x"+("0"+s[0].toString(16)).slice(-2)+"-\\x"+s[1].toString(16)+")\\]","g"),String.fromCharCode(..." ".repeat(s[1]-s[0]+1).split("").map((t,o)=>o+s[0])))))},this.selftest=function(){var t={};for(var s in this.symbols)t[s]=this.getsymbols(s).length;for(s=2;s<=95;s++)t[s]=this.getsymbols(s).length;t[256]=256;var o="";t=Object.keys(t).sort(function(s,o){return t[s]-t[o]});for(var r in t){s={fromBase:10,toBASE:t[r]};var n=this.convert("",10,s.toBASE);o+="\r\noBASE.convert(n, '"+s.fromBase+"', '"+s.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n";for(var i=0;i<this.fromSymbols.length+2;i++)n=this.convert(String(i),s.fromBase,s.toBASE),o+=i+(String(i)==this.convert(n,s.toBASE,s.fromBase)?">":"?")+"["+n+"] "}return o};var t=function(t,s,o){for(var r=Math.max(t.length,s.length),n=e=0,i=[];e<r||n;n=Math.floor(h/o))var h=n+(e<t.length?t[e]:0)+(e<s.length?s[e]:0),e=i.push(h%o);return i},s=function(s,o,r){for(var n=s<0?null:[];s>0;s>>=1)1&s&&(n=t(n,o,r)),o=t(o,o,r);return n}}

              自测:

              // quick test, convert from base45 to base32, using custom symbols for base85 and back to base45
              
              var oBASE = new BASE();
              console.log(oBASE.selftest())  
                
              function BASE(){this.convert=function(o,r,n){this.fromSymbols="object"==typeof r?r[0]:this.getsymbols(r),this.toSymbols="object"==typeof n?n[0]:this.getsymbols(n),r=this.fromSymbols.length,n=this.toSymbols.length;var i=[0];for(o=o.split("");o.length>0&&i[i.push(this.fromSymbols.indexOf(o.pop()))-1]>=0;);var h=i.shift()+i[i.length-1]>=0?i:null;if(null===h)return null;for(var e=0,l=(i=[],[1]);e<h.length;e++)i=t(i,s(h[e],l,n),n),l=s(r,l,n);e=i.length-1;for(var m="";e>=0;m+=this.toSymbols[i[e--]]);return 0==m.length?this.toSymbols[0]:m},this.symbols={32:function(){return this.base32hex},36:["[0-9][A-Z]"],45:function(){return this["qr-alnum"]},58:function(){return this.Bitcoin},64:["[A-Z][a-z][0-9]+/"],85:function(){return this["RFC 1924"]},91:['[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~"'],94:["[!-~]"],geohash:["[0-9][b-h]jkmn[p-z]"],"RFC 4648":["[A-Z][2-7]"],base32hex:["[0-9][A-V]"],"qr-alnum":["[0-9][A-Z] $%*+-./:"],Bitcoin:["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],"RFC 1924":["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]},this.getsymbols=function(t){return void 0===this.symbols[t]&&(this.symbols[t]=t<95?this.rng(t<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,t):this.rng("[\0-ÿ]").substring(256-t,256)),"function"==typeof this.symbols[t]&&(this.symbols[t]=this.symbols[t]()),"object"==typeof this.symbols[t]&&(this.symbols[t]=this.rng(this.symbols[t][0])),this.symbols[t]},this.rng=function(t){var s=t.match(/\[.-.\]/);return null==s?t:(s=[s[0].charCodeAt(1),s[0].charCodeAt(3)],this.rng(t.replace(RegExp("\\[(\\x"+("0"+s[0].toString(16)).slice(-2)+"-\\x"+s[1].toString(16)+")\\]","g"),String.fromCharCode(..." ".repeat(s[1]-s[0]+1).split("").map((t,o)=>o+s[0])))))},this.selftest=function(){var t={};for(var s in this.symbols)t[s]=this.getsymbols(s).length;for(s=2;s<=95;s++)t[s]=this.getsymbols(s).length;t[256]=256;var o="";t=Object.keys(t).sort(function(s,o){return t[s]-t[o]});for(var r in t){s={fromBase:10,toBASE:t[r]};var n=this.convert("",10,s.toBASE);o+="\r\noBASE.convert(n, '"+s.fromBase+"', '"+s.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n";for(var i=0;i<this.fromSymbols.length+2;i++)n=this.convert(String(i),s.fromBase,s.toBASE),o+=i+(String(i)==this.convert(n,s.toBASE,s.fromBase)?">":"?")+"["+n+"] "}return o};var t=function(t,s,o){for(var r=Math.max(t.length,s.length),n=e=0,i=[];e<r||n;n=Math.floor(h/o))var h=n+(e<t.length?t[e]:0)+(e<s.length?s[e]:0),e=i.push(h%o);return i},s=function(s,o,r){for(var n=s<0?null:[];s>0;s>>=1)1&s&&(n=t(n,o,r)),o=t(o,o,r);return n}}

              【讨论】:

                【解决方案13】:

                使用以下方式在 JavaScript 或 typescript 中将数字转换为不同的基数。

                function binary(number) {
                    console.log((number >>> 0).toString(2));   //base 2 for binary
                }
                binary(-7);
                
                function octal(number) {
                    console.log(number.toString(8));   //base 8 for octal
                }
                octal(15);
                
                function hex(number) {
                    console.log(number.toString(16));   //base 16 for hex
                }
                hex(15);

                这里在二进制函数中,可以使用number.toString(2)函数,但是在表示负数时会出现问题。以便您可以使用unsigned right shift bitwise operator (&gt;&gt;&gt;) 来解决此问题。

                【讨论】:

                  【解决方案14】:

                  检查完整的JS code 以转换为不同的基数

                  /**
                  * Convert From/To Binary/Decimal/Hexadecimal in JavaScript
                  * https://gist.github.com/shamshul2007/
                  * Copyright 2012-2015, Shamshul <shamshul2007@gmail.com>
                  * Licensed under The MIT License
                  * http://www.opensource.org/licenses/mit-license
                  */
                  
                  (function(){
                  
                      var ConvertBase = function (num) {
                          return {
                              from : function (baseFrom) {
                                  return {
                                      to : function (baseTo) {
                                          return parseInt(num, baseFrom).toString(baseTo);
                                      }
                                  };
                              }
                          };
                      };
                          
                      // binary to decimal
                      ConvertBase.bin2dec = function (num) {
                          return ConvertBase(num).from(2).to(10);
                      };
                      
                      // binary to hexadecimal
                      ConvertBase.bin2hex = function (num) {
                          return ConvertBase(num).from(2).to(16);
                      };
                      
                      // decimal to binary
                      ConvertBase.dec2bin = function (num) {
                          return ConvertBase(num).from(10).to(2);
                      };
                      
                      // decimal to hexadecimal
                      ConvertBase.dec2hex = function (num) {
                          return ConvertBase(num).from(10).to(16);
                      };
                      
                      // hexadecimal to binary
                      ConvertBase.hex2bin = function (num) {
                          return ConvertBase(num).from(16).to(2);
                      };
                      
                      // hexadecimal to decimal
                      ConvertBase.hex2dec = function (num) {
                          return ConvertBase(num).from(16).to(10);
                      };
                      //Octal to Decimal
                      ConvertBase.oct2dec = function (num) {
                          return ConvertBase(num).from(8).to(10);
                      };
                      
                       //Decimal to Octal
                      ConvertBase.dec2oct = function (num) {
                          return ConvertBase(num).from(10).to(8);
                      };
                      
                      this.ConvertBase = ConvertBase;
                      
                  })(this);
                  
                  /*
                  * Usage example:
                  * ConvertBase.bin2dec('1111'); // '15'
                  * ConvertBase.dec2hex('82'); // '52'
                  * ConvertBase.hex2bin('e2'); // '11100010'
                  * ConvertBase.dec2bin('153'); // '10011001'
                  * ConvertBase.hex2dec('1FE4ED63D55FA51E'); //'2298222722903156000'
                  * ConvertBase.oct2dec('777'); //'511'
                  * ConvertBase.dec2oct('551'); //'1047'
                  */
                  

                  【讨论】:

                    【解决方案15】:

                    您还可以将十六进制的数字转换为十进制,如下所示:

                    var a="8F";
                    var b=a.split("");
                    var result=0;var hex_multiplier=1;
                    for(var i=0;i<b.length;i++){
                        result +=parseInt(b[i],16)*hex_multiplier;
                        hex_multiplier *=16;
                    }
                    console.log(result);
                    

                    您可以用任何十六进制数更改 a 并以十进制形式获得结果。

                    【讨论】:

                      【解决方案16】:

                      您可以在某些情况下使用JavaScript's built-in integer literals

                      function binaryToDecimal(binaryString) {
                          return Number('0b' + binaryString.replace('-', '')) * signOf(binaryString);;        
                      }
                      
                      function octalToDecimal(octalString) {
                          return Number('0o' + octalString.replace('-', '')) * signOf(octalString);
                      }
                      
                      function hexToDecimal(hexString) {
                          return Number('0x' + hexString.replace('-', '')) * signOf(hexString);
                      }
                      
                      function signOf(n) {
                        return n.trim()[0] == '-' ? -1 : 1;
                      }
                      
                      console.log(binaryToDecimal('-0101'),
                                   octalToDecimal('-052171'),
                                     hexToDecimal('deadbeef'));

                      【讨论】:

                        【解决方案17】:

                        您自己的用于创建 base2 转换的递归方法。

                        正如上面的用户所说 let n = 13; console.log(n.toString(2)); 将导致 13 从基数 10 转换为基数 2。

                        但如果你想编程的话。我写了一个递归方法来做同样的事情。它只是简单地除以 2,然后计算余数。

                        // @author Tarandeep Singh :: Created recursive converter from base 10 to base 2 
                        // @date : 2017-04-11
                        // Convert Base 10 to Base 2, We should reverse the output 
                        // For Example base10to2(10) = "0101" just do res = base10to2(10).split('').reverse().join();
                        function base10to2(val, res = '') {
                          if (val >= 2) {
                            res += '' + val % 2;
                            return base10to2(val = Math.floor(val / 2), res);
                          } else {
                            res += '' + 1
                            return res;
                          }
                        }
                        
                        let n = 13;
                        
                        var result = base10to2(n).split('').reverse().join();
                        document.write(`Converting ${n} into Base2 is ${result}`);

                        【讨论】:

                          猜你喜欢
                          • 2016-08-26
                          • 1970-01-01
                          • 2016-10-18
                          • 1970-01-01
                          • 2014-09-15
                          • 2016-03-20
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-07-28
                          相关资源
                          最近更新 更多