Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 16진수를 2진수로 변환하는 프로그램 만들기

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

알고리즘 설계

변환 과정은 다음 단계로 진행됩니다.

  1. 16진수 문자열을 매개변수로 받는 convert() 함수를 선언합니다.
  2. while 반복문으로 문자열의 각 문자를 처음부터 끝까지 순회합니다.
  3. switch 문으로 현재 문자에 대응하는 4비트 2진수를 출력합니다.
  4. 영문자(A~F)는 대문자와 소문자 케이스를 함께 처리합니다.
  5. 유효하지 않은 문자가 입력되면 오류 메시지를 출력합니다.
  6. 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 케이스)를 추가해두었기 때문에 잘못된 문자가 포함된 경우에도 안정적으로 동작합니다.