문제 이해하기
다음과 같은 IPv4 주소가 있다고 가정해 보겠습니다.
128.32.10.1
이 주소를 2진수로 변환하면 다음과 같습니다.
10000000.00100000.00001010.00000001
이 2진수를 다시 부호 없는 32비트 십진수로 변환하면 다음 값이 됩니다.
2149583361
따라서 2149583361에 해당하는 IPv4 주소는 128.32.10.1이라고 할 수 있습니다.
접근 방법
우리는 32비트 부호 없는 정수를 입력받아 그에 대응하는 IPv4 주소 문자열을 반환하는 JavaScript 함수를 작성해야 합니다.
핵심 아이디어는 비트 연산자를 활용하는 것입니다. 부호 없는 오른쪽 시프트 연산자(>>>)를 사용해 각 옥텟(8비트)을 차례대로 추출하고, 비트 AND 연산(& 0xFF)으로 하위 8비트만 남긴 뒤, 점(.)으로 구분하여 연결하면 원하는 결과를 얻을 수 있습니다.
num >>> 24: 첫 번째 옥텟 추출num >>> 16 & 0xFF: 두 번째 옥텟 추출num >>> 8 & 0xFF: 세 번째 옥텟 추출num & 0xFF: 네 번째 옥텟 추출
예제 코드
다음은 전체 구현 코드입니다.
const num = 2149583361;
const int32ToIp = (num) => {
return (num >>> 24 & 0xFF) + '.' +
(num >>> 16 & 0xFF) + '.' +
(num >>> 8 & 0xFF) + '.' +
(num & 0xFF);
};
console.log(int32ToIp(num));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
128.32.10.1
정리
이처럼 비트 시프트와 마스킹 기법을 조합하면 별도의 문자열 파싱 없이도 32비트 정수를 간단하고 효율적으로 IPv4 주소 형식으로 변환할 수 있습니다. 역으로 IPv4 주소를 32비트 정수로 되돌리는 함수도 같은 원리를 응용하면 쉽게 구현할 수 있습니다.