Eu quero converter string binária em dígito, por exemplo
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Como isso é possível? obrigado
Eu quero converter string binária em dígito, por exemplo
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Como isso é possível? obrigado
parseInt(101, 2)
retorna5
.parseInt
. Eu pensei que ele iria converter a string de base 10 -> qualquer (pensando queparseInt('5612', 2)
iria retornar sua forma binária;).Number
falhará para valores tão altos (veja esta pergunta e a resposta aceita). Verificando o estado da arte hoje, você deve usarBigInt
(que é amplamente suportado). Você pode adaptar diretamente esta resposta aqui , alterando a implementação para usar explicitamenteBigInt
e o operador de exponenciação em**
vez deMath.pow
, e funcionará.ES6 suporta literais numéricos binários para inteiros, portanto, se a string binária for imutável, como no código de exemplo na pergunta, pode-se apenas digitá-la como está com o prefixo
0b
ou0B
:var binary = 0b1101000; // code for 104 console.log(binary); // prints 104
fonte
Use o parâmetro raiz de
parseInt
:var binary = "1101000"; var digit = parseInt(binary, 2); console.log(digit);
fonte
parseInt()
com radix é a melhor solução (como foi dito por muitos):Mas se você quiser implementá-lo sem parseInt, aqui está uma implementação:
function bin2dec(num){ return num.split('').reverse().reduce(function(x, y, i){ return (y === '1') ? x + Math.pow(2, i) : x; }, 0); }
fonte
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); }
fonte
var num = 10; alert("Binary " + num.toString(2)); //1010 alert("Octal " + num.toString(8)); //12 alert("Hex " + num.toString(16)); //a alert("Binary to Decimal "+ parseInt("1010", 2)); //10 alert("Octal to Decimal " + parseInt("12", 8)); //10 alert("Hex to Decimal " + parseInt("a", 16)); //10
fonte
Eu reuni tudo o que outros sugeriram e criei a seguinte função que tem 3 argumentos, o número e a base de onde esse número veio e a base na qual esse número vai estar:
changeBase(1101000, 2, 10) => 104
Execute o snippet de código para experimentar você mesmo:
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>
Para sua informação: se você deseja passar 2d como um número hexadecimal, você precisa enviá-lo como uma string para que fique assim:
changeBase('2d', 16, 10)
fonte
Outra implementação apenas para prática de JS funcional pode ser
var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c) console.log(bin2int("101010"));
+c
força oString
tipoc
a umNumber
valor de tipo para adição adequada.fonte
Algoritmo de conversão binária convencional ligeiramente modificado, utilizando um pouco mais de sintaxe ES6 e recursos automáticos:
Converter string de sequência binária em array (assumindo que já não tenha sido passado como array)
Sequência reversa para forçar o índice 0 a começar no dígito binário mais à direita, pois o binário é calculado da direita-esquerda
A função de matriz 'reduzir' atravessa a matriz, realizando a soma de (2 ^ índice) por dígito binário [somente se dígito binário === 1] (0 dígito sempre resulta em 0)
NOTA: Fórmula de conversão binária:
{onde d = dígito binário, i = índice da matriz, n = comprimento da matriz-1 (começando da direita)}
n
∑ (d * 2 ^ i)
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}).`);
fonte
// binary to decimal function bin2dec(binary) { let decimal = 0 let base = 1 let index = binary.length-1 while (index >= 0) { decimal += (binary[index] % 2) * base base = base * 2 index-- } return decimal } // decimal to binary function dec2bin(decimal){ let binary = (decimal >>> 0).toString(2) return binary }
fonte