JavaScript에서 이진 값을 십진수로 변환할 때 일어날 수 있는 무시무시한 일

지난 주에는 바이너리 작업에 많은 시간을 할애했습니다. 정확히 내가하려는 것은 사용자로부터 이진 값을 가져 와서 십진수로 변환하는 것입니다. 다음 코드로 수행하는 것은 매우 간단했습니다.


 //convert binary to decimal

function convertBinary(binary) {
 let inDecimal = 0;
 let power = 0;
 for(let i=binary.length-1; i>=0; i--) {
   if(binary[i]==1) {
   inDecimal += Math.pow(2, power);   
   }
   power++;
 }
 return inDecimal;
}

console.log(convertBinary('101')); // returns 5



보시다시피 몇 가지 변수, 루프, 내장 메서드가 사용됩니다. 이제 더 짧고 간단한 방법을 찾아야 할 때입니다.

한 줄의 코드로 가능합니까?



이유의 예!
이를 위해 몇 가지 방법을 사용할 수 있습니다.

방법 1: ES6 바이너리 리터럴



ES6에서는 binary literals 으로 이를 달성할 수 있습니다.


console.log(0B101); // returns 5

// or
console.log(0b101); // returns 5



방법 2: Number() 객체



Number(value) 개체는 문자열 형식 또는 다른 형식의 값을 인수로 받아 Number 형식으로 변환하는 함수로 사용할 수 있습니다.
Number0b101 , 0o13 , 0x0A 와 같은 리터럴 형식으로 표현할 수 있으므로 리터럴 형식의 값을 수락하고 십진수로 변환할 수 있습니다.


Number('0b101'); // returns 5

// or 
Number(0b101); // returns 5



방법 3: parseInt() 메서드



parseInt() parseInt(string, radix) 두 개의 인수를 허용합니다. 첫 번째 인수는 구문 분석할 값이고 두 번째 인수는 해당 값의 기수입니다.


console.log(parseInt('101', 2)); // returns 5



참고: 더 많은 방법을 알고 있다면 아래에 의견을 말하십시오. 이 기사를 더 유용하게 만들 것입니다.

지금이 가장 무서운 부분입니다



이제 바이너리 값을 변환할 때 으스스한 결과를 얻을 수 있는 방법이 있습니다.

1. parseInt()는 리터럴 형식의 값을 허용하지 않습니다.



아래와 같이 바이너리 리터럴을 변환하려고 하면 다음과 같은 결과가 나옵니다. 변환할 수 없는 것을 찾을 때까지 숫자 형식으로 변환할 수 있는 모든 값을 가져오기 때문입니다.

이 경우에는 0만 잡고 b는 문자열형 문자로 받습니다. 그래서 0만 반환합니다.


parseInt('0b101', 2); // returns 0



2. parseInt()는 숫자 구분 기호와 함께 작동하지 않습니다.



긴 숫자를 읽기 쉽게 구분하기 위해 numeric separator을 사용합니다.

그러나 parseInt() 와 함께 사용하면 잘못된 결과가 나타납니다. 밑줄을 찾을 때까지 첫 번째 문자를 잡고 number 유형으로 변환합니다.


parseInt('11_00', 2); // returns 3 expected 12



3. parseInt()는 호환되지 않는 기수가 있는 NaN을 반환합니다.





parseInt('321', 10); // returns 321

parseInt('321', 2)); // returns NaN



이것은 내가 바이너리로 작업하여 얻은 끔찍한 결과입니다. 당신이 더 많은 것을 얻는다면 그들이 얼마나 무서운지 알려주는 것을 잊지 마십시오.

좋은 웹페이지 즐겨찾기