Як конвертувати числа між різними базами в JavaScript?


79

Я хотів би перетворити числа між різними основами, такими як шістнадцяткове та десяткове.

Приклад: Як перетворити шістнадцяткову8Fв десяткову?

Відповіді:


120

API

Щоб перетворити число в шістнадцятковий рядок:

parseInt(string, radix)
  • рядок: Обов’язково. Рядок для синтаксичного аналізу

  • radix: Необов’язково. Число (від 2 до 36), яке представляє систему числення, яку слід використовувати

Щоб перетворити з числа в шістнадцятковий рядок:

NumberObject.toString(radix)
  • 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) );


це ще краще. зворотний.
Yves

Я не бачу, як перший перетворюється на шістнадцятковий. Ви можете пояснити це, будь ласка? Крім того, другий призведе до шістнадцяткової, а не десяткової, як позначено.
Russ Cam

@Russ Cam: Перший приймає базу як параметр - шістнадцятковим є база 16 - і повертає рядок представлення цього числа в цій базі. Ви неправильно ставитеся до другого - він справді призводить до десяткового значення.
aehlke

@Wahnfrieden - Я неправильно інтерпретував те, що ти сказав. Зараз мені зрозуміло :)
Russ Cam

6
Це не вдається для баз більше 36, оскільки toStringкидає a RangeError. Великі бази явно не має сенсу представляти як персонажі.
Анко

23

Я прийшов на цю посаду, потребуючи перетворення з бази 10 на 62 і навпаки. Незважаючи на те, що тут рішення чудові, parseIntі toStringпідтримують лише базу від 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в базу 64?
Cyoce

Я жодного особисто не пошкодував.
Ryan Smith

1
Схоже, десь є помилка. Перетворення "111222444abcdef" з бази 16 на 10 і назад приводить до результату "111222444abcdf0"
експерт

Я відчуваю, що це може бути пов’язано з точністю чисел у JavaScript @expert, оскільки помилка спричинена dec_value % to_baseвеликими числами, але я, здається, не можу відтворити її для менших чисел.
Ryan Smith

1
@RyanSmith Ви маєте рацію, це роблять і інші онлайн- конвертери.
ReinstateMonica3167040

10

Ви можете спробувати наступний код, який також підтримує довільні цифри точності (більше 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

Основний код був знайдений тут , у мене є трохи удосконалили також підтримує дощенту 64.


1
Це дуже хороший код! Чи знаєте ви, чи існує версія цього С? Здається, не знаходжу!
Зібрі

2
@Zibri, вибач, IDK. Але ви можете перетворити його самостійно та поділитися тут з іншими.
Славік Мельцер

9

Наступна схема може допомогти. Зверніть увагу, що для перетворення з бази 16 на базу 2 потрібно перетворити спочатку на базу 10, а потім базу 2.

Базове перетворення


8

Ну, я зробив функцію, яка може перекласти з бази 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.
ReinstateMonica3167040

використовуйте "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /", і ви можете піднятися на base64 (справжній, щоб не плутати з btoa / atob)
Zibri

@oooyaya Насправді він видає "2S", правильна відповідь. До речі, використовуйте var x = 100; x.toString (26);
ReinstateMonica3167040

8

Вкажіть радіус, який ви хочете використовувати як параметр.

ПРИМІТКА: Це працює лише для перетворення з основ 2-36 в десяткові та малі значення.

parseInt(string, radix) 

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

Про «мало», parseInt("6f", 32)прекрасно (= 207),
але і будь-який інший трохи більше буде також 207, 6f1, 6f11, ...


@Nosredna, ти маєш рацію, але Russ Cam отримав правильний синтаксис для мене parseInt - цього більш ніж достатньо. Дякую.
Yves

3
@RussCam Я не голосував проти, але я думаю, що це тому, що ця відповідь обмежена перетворенням в десяткову, що стосується наведеного прикладу, але питання було between different bases. (Я не маю сумнівів, що це заважало вам ці шість років.)
Antti29,

6

Ця функція генерує десяткове число для будь-якої основи від 2 до 36. (як, наприклад, javascript)

Але ви можете збільшити базу більше ніж 36, просто додавши новий символ у keys[]нижньому регістрі ["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)) 


5

Зазвичай я використовую цю функцію для перетворення з різних баз.

Наприклад, він повертає "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)
    };
}

3

Я написав функцію для перетворення рядка JavaScript з однієї бази на іншу, з оригінальною базою та новою базою, вказаними як параметри.

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

alert(convertFromBaseToBase(10, 2, 10));


Так, це шлях!
Ansjovis86,


1

Перевірте повний код JS для конвертації в іншу базу

/**

* Перетворити з / у двійковий / десятковий / шістнадцятковий в JavaScript * https://gist.github.com/shamshul2007/ * Авторське право 2012-2015, Shamshul * Ліцензовано за ліцензією MIT * http://www.opensource.org/licenses / mit-ліцензія * /

(функція () {

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;

}) (це);

/ * * Приклад використання: * 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' * /


1

Ви можете використовувати вбудовані цілочисельні літерали JavaScript для деяких сценаріїв:

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'));


1

Спробуйте наступний код, оптимізований із допису Славіка Мельцера, реалізує перетворення BASE n з усіма комбінаціями radix між Base2 і Base256 . Цей код приймає три типи аргументів для визначення вихідних і кінцевих систем числення:

  • за радіусом системи числення (наприклад, 8)
  • за назвою конвенційної системи (наприклад, "Біткойн")
  • вказуючи власні цифри як аргумент (наприклад, ['0123456789ABCDEF'])

Ви побачите, що деякі цифри системи числення були жорстко закодовані всередині класу і будуть використовуватися за замовчуванням, коли ви передаєте radix як аргумент. (. напр. 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}}


0

Ви також можете перетворити число в шістнадцятковому в десяткове наступним чином:

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 на будь-яке шістнадцяткове число і отримати результат у десятковій формі.


0

перетворити числа в різні бази в JavaScript або машинописі, використовуючи такі способи.

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 (>>>)щоб вирішити цю проблему.


-2

Ваш власний метод рекурсії для створення конверсій 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}`);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.