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


109

이진 문자열을 숫자로 변환하고 싶습니다.

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

그게 어떻게 가능해? 감사

답변:


210

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

var digit = parseInt(binary, 2);

실제로 확인하십시오 .


1
여전히 관련이 있습니까? parseInt(101, 2)를 반환합니다 5.
srph

14
@srph : 놀라운 일이 아닙니다. 2 진법 101은 10 진법 5입니다.
Jon

3
아, 알겠습니다. 나는 parseInt. 나는 그것이 base 10에서 문자열을 변환 할 것이라고 생각했다 parseInt('5612', 2).
srph

1
@baptx a를 반환하는 모든 메서드는 Number이러한 높은 값에 대해 실패합니다 ( 이 질문 및 수락 된 답변 참조). 오늘 최신 상태를 확인하고 BigInt대신 (광범위하게 지원되는)를 사용해야 합니다. 대신 명시 적으로 사용 하고 지수 연산자 를 사용하도록 구현을 변경하여 여기에서이 대답을 직접 조정할 수 있으며 작동합니다. BigInt**Math.pow
Jon

1
@baptx 여기 에 바이올린을 만들었습니다 . 나는 이것이 "확장"이라고 말하자 대답에 포함되는 장점이 있다고 생각하지 않습니다.
Jon

21

ES6는 정수에 대한 이진 숫자 리터럴 을 지원 하므로 질문의 예제 코드에서와 같이 이진 문자열이 변경 불가능한 경우 접두사 0b또는 0B다음 과 같이 입력 할 수 있습니다 .

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

12

다음의 기수 매개 변수를 사용하십시오 parseInt.

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

12

parseInt() 기수를 사용하는 것이 최상의 솔루션입니다 (많은 사람들이 말했듯이).

그러나 parseInt없이 구현하려는 경우 다음 구현이 있습니다.

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

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

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

나는 다른 사람들이 제안한 것을 모두 모아서 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>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>

참고 : 16 진수로 2d를 전달하려면 다음과 같이 문자열로 보내야합니다. changeBase('2d', 16, 10)


1
부동 소수점 숫자를 처리하지 않습니다. 3.14159265,10,16 준다 3
마크 매닝에게

1

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

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
여기서, +c강제 변환은 String입력 c(A)에 Number적절히 첨가 타입 값.


0

ES6 구문과 자동 기능을 사용하여 약간 수정 된 기존 바이너리 변환 알고리즘 :

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

  2. 이진수가 오른쪽에서 왼쪽으로 계산되므로 0 인덱스가 맨 오른쪽 이진수에서 시작하도록 시퀀스를 반대로 수행합니다.

  3. 'reduce'배열 함수는 배열을 가로 질러 이진 수당 (2 ^ index)의 합계를 수행합니다. [이진수 === 1 인 경우에만] (0 자리는 항상 0을 생성 함)

참고 : 이진 변환 공식 :

{여기서 d = 이진 숫자, i = 배열 ​​인덱스, n = 배열 ​​길이 -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}).`);

0
// 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.