¿Cómo convertir una cadena binaria a decimal?

100

Quiero convertir una cadena binaria en dígitos Eg

var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);

¿Como es posible? Gracias


fuente

Respuestas:

196

La parseIntfunción convierte cadenas en números y toma un segundo argumento que especifica la base en la que la representación de la cadena es:

var digit = parseInt(binary, 2);

Véalo en acción .

Jon
fuente
1
¿Sigue siendo relevante? parseInt(101, 2)devuelve 5.
srph
13
@srph: Eso no es sorprendente, 101 en base 2 es 5 en base 10.
Jon
3
Ah, ya veo. Debo haber entendido mal qué es parseInt. Pensé que convertiría la cadena de base 10 -> lo que sea (pensar como parseInt('5612', 2)devolvería su forma binaria;).
srph
21

ES6 admite literales numéricos binarios para números enteros, por lo que si la cadena binaria es inmutable, como en el código de ejemplo en la pregunta, uno podría simplemente escribirlo como está con el prefijo 0bo 0B:

var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
GOTO 0
fuente
12

parseInt() con radix es la mejor solución (como dijeron muchos):

Pero si desea implementarlo sin parseInt, aquí hay una implementación:

  function bin2dec(num){
    return num.split('').reverse().reduce(function(x, y, i){
      return (y === '1') ? x + Math.pow(2, i) : x;
    }, 0);
  }
Salvador Dalí
fuente
11

Utilice el parámetro de base de parseInt:

var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);
Phihag
fuente
3
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);
}
Iliyan Shalvarkov
fuente
3
        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
Md Shahriar
fuente
2

Reuní todo lo que otros han sugerido y creé la siguiente función que tiene 3 argumentos, el número y la base de la que proviene ese número y la base en la que estará ese número:

changeBase(1101000, 2, 10) => 104

Ejecute el fragmento de código para probarlo usted mismo:

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>

FYI: Si desea pasar 2d como número hexadecimal, debe enviarlo como una cadena para que sea así: changeBase('2d', 16, 10)

Muhammad Musavi
fuente
No maneja números de coma flotante. 3.14159265,10,16 da 3
Mark Manning
1

Otra implementación solo para la práctica funcional de JS podría ser

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
donde +ccoacciona el Stringtipo ca un Numbervalor de tipo para una adición adecuada.

Redu
fuente
0

Algoritmo de conversión binaria convencional ligeramente modificado que utiliza más sintaxis y funciones automáticas de ES6:

  1. Convierta la cadena de secuencia binaria en Array (suponiendo que no se haya pasado ya como matriz)

  2. Secuencia inversa para forzar que el índice 0 comience en el dígito binario más a la derecha, ya que el binario se calcula de derecha a izquierda

  3. La función de matriz 'reducir' atraviesa la matriz, realizando la suma de (2 ^ índice) por dígito binario [solo si dígito binario === 1] (0 dígito siempre da como resultado 0)

NOTA: Fórmula de conversión binaria:

{donde d = dígito binario, i = índice de matriz, n = longitud de matriz-1 (comenzando desde la derecha)}

norte
∑ (d * 2 ^ i)
yo = 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}).`);
Isaac
fuente