16진수(Hexadecimal)가 입력으로 주어졌을 때, 이를 2진수(Binary)로 변환하는 것이 이번 글의 목표입니다. C++의 switch 문을 활용하면 복잡한 계산 없이도 손쉽게 변환 로직을 구현할 수 있습니다.
16진수와 2진수의 기본 개념
컴퓨터에서 16진수는 밑(base)이 16인 수 체계이며, 2진수는 밑이 2인 수 체계로 0과 1 두 개의 숫자만 사용합니다. 16진수는 0부터 15까지의 값을 표현할 수 있는데, 10 이상의 값은 다음과 같이 알파벳으로 나타냅니다.
- 10 → A
- 11 → B
- 12 → C
- 13 → D
- 14 → E
- 15 → F
변환 원리
16진수를 2진수로 변환하는 핵심 원리는 간단합니다. 각 16진수 자릿수를 4비트(4자리) 2진수로 바꾼 뒤, 이들을 순서대로 이어 붙이면 하나의 완전한 2진수가 됩니다. 16진수 한 자리는 정확히 4비트로 표현되기 때문에(2⁴ = 16), 자릿수 대응이 깔끔하게 떨어집니다.
변환 예시
입력값: 123B
1 → 0001
2 → 0010
3 → 0011
B (11) → 1011
출력값: 0001001000111011
알고리즘 설계
변환 과정은 다음 단계로 진행됩니다.
- 16진수 문자열을 매개변수로 받는
convert()함수를 선언합니다. while반복문으로 문자열의 각 문자를 처음부터 끝까지 순회합니다.switch문으로 현재 문자에 대응하는 4비트 2진수를 출력합니다.- 영문자(A~F)는 대문자와 소문자 케이스를 함께 처리합니다.
- 유효하지 않은 문자가 입력되면 오류 메시지를 출력합니다.
main()함수에서 16진수 문자열을 정의하고 변환 함수를 호출합니다.
C++ 전체 구현 코드
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
// 16진수를 2진수로 변환하는 함수
void convert(string hexa){
long int i = 0;
while (hexa[i]){
switch (hexa[i]){
case '0':
cout << "0000";
break;
case '1':
cout << "0001";
break;
case '2':
cout << "0010";
break;
case '3':
cout << "0011";
break;
case '4':
cout << "0100";
break;
case '5':
cout << "0101";
break;
case '6':
cout << "0110";
break;
case '7':
cout << "0111";
break;
case '8':
cout << "1000";
break;
case '9':
cout << "1001";
break;
case 'A':
case 'a':
cout << "1010";
break;
case 'B':
case 'b':
cout << "1011";
break;
case 'C':
case 'c':
cout << "1100";
break;
case 'D':
case 'd':
cout << "1101";
break;
case 'E':
case 'e':
cout << "1110";
break;
case 'F':
case 'f':
cout << "1111";
break;
default:
cout << "\n유효하지 않은 16진수입니다: " << hexa[i];
}
i++;
}
}
int main(){
string hexa = "123B";
cout << "\n2진수 변환 결과 : ";
convert(hexa);
return 0;
}
실행 결과
2진수 변환 결과 : 0001001000111011
마무리
이처럼 16진수의 각 자릿수가 항상 4비트의 2진수와 일대일로 대응된다는 점을 활용하면, 산술 연산 없이 문자열 처리만으로 빠르고 정확하게 진법 변환을 수행할 수 있습니다. 입력 유효성 검사(default 케이스)를 추가해두었기 때문에 잘못된 문자가 포함된 경우에도 안정적으로 동작합니다.