programing

이진 문자열을 10진수로 변환하는 방법은?

newstyles 2023. 9. 6. 21:52

이진 문자열을 10진수로 변환하는 방법은?

이진 문자열을 숫자 예로 변환합니다.

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

그게 어떻게 가능해?감사해요.

함수는 문자열을 숫자로 변환하며, 문자열 표현의 기본을 지정하는 두 번째 인수를 사용합니다.

var digit = parseInt(binary, 2);

실제로 보세요.

ES6는 정수에 대한 이진 숫자 리터럴을 지원하므로 문제의 예제 코드처럼 이진 문자열이 불변인 경우 접두사를 사용하여 그대로 입력할 수 있습니다.0b아니면0B:

var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
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

다음의 radix 매개변수를 사용합니다.

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

parseInt()radix를 사용하는 것이 가장 좋은 솔루션입니다(많은 분들이 말씀하셨습니다).

그러나 parseInt 없이 구현하려면 다음과 같이 구현해야 합니다.

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

저는 다른 사람들이 제안한 모든 것을 모아서 3개의 인수가 있는 함수를 만들었습니다. 그 숫자와 그 숫자가 나온 밑과 그 숫자가 들어갈 밑은 다음과 같습니다.

changeBase(1101000, 2, 10) => 104

코드 스니펫을 실행하여 직접 사용해 보십시오.

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>Examples: <br />
  <em>110, 2, 10</em> => <em>6</em>; (110)<sub>2</sub> = 6<br />

  <em>2d, 16, 10</em> => <em>45</em>; (2d)<sub>16</sub> = 45<br />
  <em>45, 10, 16</em> => <em>2d</em>; 45 = (2d)<sub>16</sub><br />
  <em>101101, 2, 16</em> => <em>2d</em>; (101101)<sub>2</sub> = (2d)<sub>16</sub>
</p>

참고: 통과하려면2d16진수로서 문자열로 보내야 다음과 같습니다.changeBase('2d', 16, 10)

@baptx, @Jon@ikhvjs 주석을 기반으로 다음은 정말 큰 이진 문자열과 함께 작동해야 합니다.

// ES10+
function bin2dec(binStr) {
    const lastIndex = binStr.length - 1;

    return Array.from(binStr).reduceRight((total, currValue, index) => (
        (currValue === '1') ? total + (BigInt(2) ** BigInt(lastIndex - index)) : total
    ), BigInt(0));
}

또는, a를 사용하여 동일.for루프:

// ES10+
function bin2dec(binStr) {
    const lastIndex = binStr.length - 1;
    let total = BigInt(0);

    for (let i = 0; i < binStr.length; i++) {
        if (binStr[lastIndex - i] === '1') {
            total += (BigInt(2) ** BigInt(i));
        }
    }

    return total;
}

예를 들어,

console.log(bin2dec('101')); // 5n

console.log(bin2dec('110101')); // 53n

console.log(bin2dec('11111111111111111111111111111111111111111111111111111')); // 9007199254740991n

console.log(bin2dec('101110110001101000111100001110001000101000101011001100000011101')); // 6741077324010461213n

더 배우고 싶은 분들을 위해 블로그에 글을 올렸습니다.

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

기능적인 JS 연습만을 위한 또 다른 구현은 다음과 같습니다.

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
where +c coerces String type c to a Number type value for proper addition.

일부 ES6 구문 및 자동 기능을 사용하여 약간 수정된 기존의 이진 변환 알고리즘:

  1. 이진 시퀀스 문자열을 배열로 변환(이미 배열로 전달되지 않았다고 가정)

  2. 역순서를 사용하여 이진법이 오른쪽에서 왼쪽으로 계산됨에 따라 0 인덱스를 오른쪽에서 시작합니다.

  3. 'reduce' 배열 함수는 배열을 횡단하여 이진 자리당 (2^index)의 합을 수행합니다 [이진 자리수 === 1인 경우에만] (0 자리수는 항상 0이 됩니다).

참고: 이진 변환 공식:

{여기서 d=digit, i=array 인덱스, n=array length-1(오른쪽부터 시작)}

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}).`);

언급URL : https://stackoverflow.com/questions/10258828/how-to-convert-binary-string-to-decimal