Я хочу преобразовать двоичную строку в цифру Например
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Как это возможно? Благодаря
Я хочу преобразовать двоичную строку в цифру Например
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Как это возможно? Благодаря
Функция parseInt
преобразует строки в числа и принимает второй аргумент, определяющий базу, в которой представлено строковое представление:
var digit = parseInt(binary, 2);
ES6 поддерживает двоичные числовые литералы для целых чисел, поэтому, если двоичная строка неизменна, как в примере кода в вопросе, можно просто введите его так же, как с префиксом 0b
или 0b
:
var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
parseInt()
с radix - лучшее решение (как было сказано многими):
Но если вы хотите реализовать его без parseInt, вот реализация:
function bin2dec(num){
return num.split('').reverse().reduce(function(x, y, i){
return (y === '1') ? x + Math.pow(2, i) : x;
}, 0);
}
Используйте параметр radix parseInt
:
var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);
function binaryToDecimal(string) {
let decimal = +0;
let bits = +1;
for(let i = 0; i < string.length; i++) {
let currNum = +(string[string.length - i - 1]);
if(currNum === 1) {
decimal += bits;
}
bits *= 2;
}
console.log(decimal);
}
Другая реализация только для функциональной JS-практики может быть
var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
Я собрал все, что предложили другие, и создал следующую функцию, которая имеет 3 аргумента: номер и базу, из которой пришло это число, и базу, на которой будет происходить это число:
changeBase(1101000, 2, 10) => 104
Запустите фрагмент кода, чтобы попробовать его самостоятельно:
function changeBase(number, fromBase, toBase) {
if (fromBase == 10)
return (parseInt(number)).toString(toBase)
else if (toBase == 10)
return parseInt(number, fromBase);
else{
var numberInDecimal = parseInt(number, fromBase);
return (parseInt(numberInDecimal)).toString(toBase);
}
}
$("#btnConvert").click(function(){
var number = $("#txtNumber").val(),
fromBase = $("#txtFromBase").val(),
toBase = $("#txtToBase").val();
$("#lblResult").text(changeBase(number, fromBase, toBase));
});
#lblResult{
padding: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="txtNumber" type="text" placeholder="Number" />
<input id="txtFromBase" type="text" placeholder="From Base" />
<input id="txtToBase" type="text" placeholder="To Base" />
<input id="btnConvert" type="button" value="Convert" />
<span id="lblResult"></span>
<p>Hint: <br />
Try 110, 2, 10 and it will return 6; (110)<sub>2</sub> = 6<br />
or 2d, 16, 10 => 45 meaning: (2d)<sub>16</sub> = 45<br />
or 45, 10, 16 => 2d meaning: 45 = (2d)<sub>16</sub><br />
or 2d, 2, 16 => 2d meaning: (101101)<sub>2</sub> = (2d)<sub>16</sub><br />
</p>
Этот ответ исходит непосредственно из MDN и работает безупречно для всех чисел от -2147483648 до 2147483647. Представление представлено в форме 2 дополнения и вернет строку длиной 32. Просто используйте .slice(-6)
или все, что вы хотите использовать для размера бита. Код MDN
function arrayFromMask(nMask) {
// nMask must be between -2147483648 and 2147483647
if (nMask > 0x7fffffff || nMask < -0x80000000) {
throw new TypeError('arrayFromMask - out of range');
}
for (var nShifted = nMask, aFromMask = []; nShifted;
aFromMask.push(Boolean(nShifted & 1)), nShifted >>>= 1);
return aFromMask;
}
Слегка измененный традиционный алгоритм двоичного преобразования, использующий еще несколько синтаксисов ES6 и автоматические функции:
Преобразовать строку двоичной последовательности в массив (при условии, что это не было уже передается как массив)
Обратная последовательность для принудительного запуска индекса 0 в крайнем правом бинарном файле разряд в двоичном виде вычисляется справа налево
Функция 'массива' пересекает массив, выполняя суммирование (2 ^ индекс) на двоичную цифру [только если двоичная цифра === 1] (0 цифр всегда дает 0)
ПРИМЕЧАНИЕ: формула двоичного преобразования:
{где d = двоичная цифра, i = индекс массива, n = длина массива-1 (начиная справа)}
п
∑ (d * 2 ^ i)
= 0
let decimal = Array.from(binaryString).reverse().reduce((total, val, index)=>val==="1"?total + 2**index:total, 0);
console.log('Converted BINARY sequence (${binaryString}) to DECIMAL (${decimal}).');