Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 이진수 배열을 정수로 변환하는 방법

0과 1로만 이루어진 숫자 배열이 있다고 가정해 보겠습니다.

const arr = [0, 1, 0, 1];

우리는 이 배열에 사용될 toBinary()라는 배열 함수를 작성해야 합니다. 이 함수는 배열에 담긴 이진수 값에 대응하는 십진수 정수를 반환해야 합니다.

예를 들어, 배열이 다음과 같다면 −

const arr = [1, 0, 1, 1];

출력 결과는 11이 되어야 합니다. 이는 이진수 1011의 십진수 표현이 11이기 때문입니다.

그럼 이 기능을 구현하는 코드를 살펴보겠습니다. 크게 두 가지 방법이 있습니다.

방법 1: parseInt() 라이브러리 메서드 활용

JavaScript에는 parseInt()라는 내장 메서드가 존재합니다. 이 메서드는 두 개의 인수를 받는데, 첫 번째는 문자열이고 두 번째는 진법을 나타내는 숫자입니다. 예를 들어 10은 십진수, 2는 이진수를 의미합니다. parseInt()는 문자열 인수를 파싱하여 지정된 진법(기수)의 정수를 반환합니다.

따라서 이진수 배열을 십진수로 변환하려면 다음과 같이 parseInt()를 활용할 수 있습니다.

  1. 먼저 join() 메서드를 사용해 배열의 모든 요소를 하나의 이진수 문자열로 합칩니다.
  2. 그런 다음 그 문자열과 진법 2를 parseInt()에 전달하여 십진수 정수로 변환합니다.
const arr = [1, 0, 1, 1];
const parseArray = arr => {
    const binaryString = arr.join("");
    return parseInt(binaryString, 2);
};
console.log(parseArray(arr));

방법 2: reduce()와 비트 연산자 활용

두 번째 방법은 라이브러리 메서드에 의존하지 않고, 배열을 직접 순회하며 이진수 값을 기반으로 십진수를 만드는 방식입니다. 여기서는 reduce() 메서드와 함께 비트 연산자를 사용합니다.

핵심 아이디어는 다음과 같습니다. 누적값(acc)을 매번 왼쪽 시프트 연산자(<<)로 한 비트씩 왼쪽으로 밀어낸 뒤, 현재 값(val)과 비트 OR(|) 연산을 수행합니다. 이 과정을 배열의 끝까지 반복하면 이진수가 자연스럽게 십진수로 변환됩니다.

예제 코드

const arr = [1, 0, 1, 1];
const parseArray = arr => {
    return arr.reduce((acc, val) => {
        return (acc << 1) | val;
    });
};
console.log(parseArray(arr));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

11

정리

두 방법 모두 동일한 결과를 반환하지만 상황에 따라 선택 기준이 달라집니다. parseInt() 방식은 코드가 간결하고 직관적이라 가독성이 뛰어나며, reduce() + 비트 연산 방식은 중간에 문자열 변환 없이 숫자 연산만 수행하므로 성능 면에서 유리할 수 있습니다. 배열의 길이가 매우 길어져 Number.MAX_SAFE_INTEGER(약 9×10¹⁵)를 초과하는 큰 이진수를 다뤄야 한다면 BigInt나 문자열 기반 처리를 고려하는 것이 좋습니다.