Chcę przekonwertować ciąg binarny na cyfrę Eg
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Jak to jest możliwe? Dzięki
Chcę przekonwertować ciąg binarny na cyfrę Eg
var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);
Jak to jest możliwe? Dzięki
Odpowiedzi:
parseIntKonwertuje ciągi liczb, a to trwa drugi argument określający podstawy, w którym reprezentacja ciąg jest:
var digit = parseInt(binary, 2);
parseInt. Pomyślałem, że skonwertuje ciąg z podstawy 10 -> cokolwiek (myślenie parseInt('5612', 2)zwróci jego formę binarną;).
Numberzakończy się niepowodzeniem dla tak wysokich wartości (zobacz to pytanie i zaakceptowaną odpowiedź). Sprawdzając dzisiejszy stan wiedzy, powinieneś BigIntzamiast tego użyć (który jest szeroko obsługiwany). Możesz bezpośrednio dostosować tę odpowiedź tutaj , zmieniając implementację, aby jawnie używać BigInti operatora potęgowania **zamiast Math.pow, i będzie działać.
ES6 obsługuje binarne literały numeryczne dla liczb całkowitych, więc jeśli ciąg binarny jest niezmienny, jak w przykładowym kodzie w pytaniu, można po prostu wpisać go tak, jak jest z prefiksem 0blub 0B:
var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
parseInt() z radix jest najlepszym rozwiązaniem (jak wielu mówiło):
Ale jeśli chcesz zaimplementować to bez parseInt, oto implementacja:
function bin2dec(num){
return num.split('').reverse().reduce(function(x, y, i){
return (y === '1') ? x + Math.pow(2, i) : x;
}, 0);
}
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);
}
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
Zebrałem wszystko, co inni zasugerowali i stworzyłem następującą funkcję, która ma 3 argumenty, liczbę i podstawę, z której ta liczba pochodzi oraz podstawę, na której ta liczba ma się znajdować:
changeBase(1101000, 2, 10) => 104
Uruchom fragment kodu, aby spróbować samemu:
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: Jeśli chcesz przekazać 2d jako liczbę szesnastkową, musisz wysłać ją jako ciąg, aby wyglądała następująco:
changeBase('2d', 16, 10)
Inną implementacją tylko do ćwiczenia funkcjonalnego JS może być
var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
+cwymusza Stringtyp cna Numberwartość typu w celu odpowiedniego dodania.
Nieznacznie zmodyfikowany konwencjonalny algorytm konwersji binarnej wykorzystujący więcej składni ES6 i auto-funkcje:
Konwertuj ciąg sekwencji binarnej na Array (zakładając, że nie został jeszcze przekazany jako tablica)
Odwróć sekwencję, aby wymusić rozpoczęcie indeksu 0 od prawej strony cyfry binarnej, ponieważ binarny jest obliczany od prawej do lewej
Funkcja „redukuj” tablica przechodzi przez tablicę, wykonując sumowanie (2 ^ indeks) na cyfrę binarną [tylko jeśli cyfra binarna === 1] (cyfra 0 zawsze daje 0)
UWAGA: Formuła konwersji binarnej:
{gdzie d = cyfra binarna, i = indeks tablicy, n = długość tablicy-1 (zaczynając od prawej)}
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}).`);
// 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
}
parseInt(101, 2)zwraca5.