Wie konvertiere ich eine binäre Zeichenfolge in eine Dezimalzahl?


93

Ich möchte eine binäre Zeichenfolge in eine Ziffer konvertieren, z

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

Wie ist es möglich? Vielen Dank

Antworten:


186

Die parseIntFunktion konvertiert Zeichenfolgen in Zahlen und benötigt ein zweites Argument, das die Basis angibt, in der die Zeichenfolgendarstellung lautet:

var digit = parseInt(binary, 2);

Sehen Sie es in Aktion .


1
Ist das noch relevant? parseInt(101, 2)kehrt zurück 5.
srph

13
@srph: Das ist nicht überraschend, 101 in Basis 2 ist 5 in Basis 10.
Jon

3
Ah ich sehe. Ich muss falsch verstanden haben, was die parseInt. Ich dachte, es würde den String von Basis 10 konvertieren -> was auch immer ( parseInt('5612', 2)wenn ich so denke, würde es seine binäre Form zurückgeben;).
srph

20

ES6 unterstützt binäre numerische Literale für Ganzzahlen. Wenn die binäre Zeichenfolge also unveränderlich ist, wie im Beispielcode in der Frage, können Sie sie einfach so eingeben, wie sie mit dem Präfix 0boder 0B:

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

12

parseInt() mit radix ist die beste lösung (wie von vielen gesagt wurde):

Wenn Sie es jedoch ohne parseInt implementieren möchten, finden Sie hier eine Implementierung:

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

11

Verwenden Sie den Radix- Parameter von parseInt:

var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);

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

2
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);
}

1

Eine andere Implementierung nur für das funktionale JS-Üben könnte sein

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
Dabei +cwird der StringTyp cfür eine Numberordnungsgemäße Addition auf einen Typwert gezwungen .


1

Ich habe alles gesammelt, was andere vorgeschlagen haben, und folgende Funktion erstellt, die 3 Argumente hat, die Nummer und die Basis, von der diese Nummer stammt, und die Basis, auf der diese Nummer sein wird:

changeBase(1101000, 2, 10) => 104

Führen Sie Code Snippet aus, um es selbst zu versuchen:

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>

Zu Ihrer Information: Wenn Sie 2d als Hex-Zahl übergeben möchten, müssen Sie es als Zeichenfolge senden, damit es so aussieht: changeBase('2d', 16, 10)


Behandelt keine Gleitkommazahlen. 3.14159265,10,16 gibt 3
Mark Manning

0

Leicht modifizierter herkömmlicher binärer Konvertierungsalgorithmus mit etwas mehr ES6-Syntax und automatischen Funktionen:

  1. Konvertieren Sie eine binäre Sequenzzeichenfolge in ein Array (vorausgesetzt, sie wurde noch nicht als Array übergeben).

  2. Umgekehrte Reihenfolge, um zu erzwingen, dass der Index 0 bei der Binärziffer ganz rechts beginnt, da die Binärzahl von rechts nach links berechnet wird

  3. 'redu' 'Array-Funktion durchläuft das Array und führt eine Summierung von (2 ^ Index) pro Binärziffer durch [nur wenn Binärziffer === 1] (0-Ziffer ergibt immer 0)

HINWEIS: Binäre Konvertierungsformel:

{wobei d = Binärziffer, i = Array-Index, n = Array-Länge-1 (von rechts beginnend)}

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}).`);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.