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