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


quelle

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 .

Jon
quelle
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
GOTO 0
quelle
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);
  }
Salvador Dali
quelle
11

Verwenden Sie den Radix- Parameter von parseInt:

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

Reduzieren
quelle
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)

Mohammad Musavi
quelle
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}).`);
Isaac
quelle