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

C 언어로 2진수를 16진수로 변환하는 방법 완벽 정리

2진수와 16진수의 기본 개념

2진수(binary number)는 1과 0 두 개의 숫자만으로 값을 표현하는 기수법입니다.

반면 16진수(hexadecimal)는 총 16개의 기호, 즉 {0, 1, 2, 3, ..., 9, A(10), B(11), ..., F(15)}를 사용하여 수를 나타냅니다.

2진수를 16진수로 변환하는 원리

2진수를 16진수로 변환하려면 최하위 비트(LSB) 쪽부터 4비트씩 묶습니다. 이렇게 묶인 4비트 단위를 니블(nibble)이라고 부르며, 각 니블을 해당하는 16진수 숫자 하나로 치환하면 변환이 완료됩니다.

다음 예시를 통해 2진수와 16진수의 대응 관계를 쉽게 이해할 수 있습니다.

0011 1110 0101 1011 0001 1101
  3    E    5    B   1    D

C 언어에서 16진수 상수는 위 값처럼 0x3E5B1D 형태로 표기합니다.

십진수를 2진수로 변환한 뒤 다시 16진수로 바꾸는 과정의 또 다른 예는 다음과 같습니다.

7529D = 0000 0000 0000 0000 0001 1101 0110 1001B
      = 0x00001D69 = 0x1D69

while 반복문을 활용한 C 변환 프로그램

다음은 while 반복문을 사용하여 입력받은 2진수를 동등한 16진수로 변환하는 C 프로그램입니다.

#include <stdio.h>
int main(){
   long int binaryval, hexadecimalval = 0, i = 1, remainder;
   printf("Enter the binary number: ");
   scanf("%ld", &binaryval);
   while (binaryval != 0){
      remainder = binaryval % 10;
      hexadecimalval = hexadecimalval + remainder * i;
      i = i * 2;
      binaryval = binaryval / 10;
   }
   printf("Equivalent hexadecimal value: %lX", hexadecimalval);
   return 0;
}

프로그램 동작 원리

이 프로그램은 다음과 같은 단계로 동작합니다.

1. 사용자로부터 2진수를 long int 형태로 입력받습니다.
2. while 루프 안에서 % 10 연산으로 가장 오른쪽 자릿수(비트)를 하나씩 추출합니다.
3. 추출한 비트에 자리값(i, 초기값 1이며 매번 2배씩 증가)을 곱하여 누적합니다.
4. 모든 비트를 처리하면 누적된 값이 곧 2진수의 실제 값이 되며, %lX 서식 지정자를 통해 16진수 형태로 출력됩니다.

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Enter the binary number: 11100
Equivalent hexadecimal value: 1C