36.9 배열을 활용하여 10진수를 2진수로 변환하기
이번에는 배열을 응용해서 10진수를 2진수로 변환한 뒤 배열에 넣어보겠습니다. 그런데 10진수에서 2진수로는 어떻게 변환할까요?
방법은 간단합니다. 10진수를 0이 될 때까지 2로 계속 나눈 뒤 나머지를 역순으로 읽으면 2진수가 됩니다.
예를 들어 13을 2진수로 변환한다면 13을 2로 나누면 몫은 6이 나오고 나머지는 1이 나옵니다. 6은 13 아래에 적고 1은 6 옆에 적습니다. 이런 식으로 계속 2로 나누어서 몫과 나머지를 구하여 몫이 0이 나오면 가장 아래의 나머지부터 역순으로 읽습니다. 여기서는 1101이 되겠죠?
이제 이 식을 코드로 표현해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
convert_decimal_binary.c
#include <stdio.h> int main() { int decimal = 13; int binary[20] = { 0, }; int position = 0; while (1) { binary[position] = decimal % 2; // 2로 나누었을 때 나머지를 배열에 저장 decimal = decimal / 2; // 2로 나눈 몫을 저장 position++; // 자릿수 변경 if (decimal == 0) // 몫이 0이 되면 반복을 끝냄 break; } // 배열의 요소를 역순으로 출력 for (int i = position - 1; i >= 0; i--) { printf("%d", binary[i]); } printf("\n"); return 0; }
실행 결과
1101
먼저 변환할 10진수 13을 변수 decimal에 저장하고, 2진수를 저장할 배열 binary를 선언한 뒤 0으로 초기화했습니다.
int decimal = 13; int binary[20] = { 0, };
10진수를 2진수로 변환하는 식은 같은 계산을 계속 반복하는 구조입니다. 따라서 while로 무한 루프를 만들었습니다. 반복문 안에서는 binary[position] = decimal % 2와 같이 10진수를 2로 나누었을 때 나머지를 구하여 binary 배열에 넣어줍니다. 그리고 decimal을 2로 나눈 몫을 다시 decimal에 저장해줍니다. 계산이 끝났다면 다음 자리를 저장할 수 있도록 position의 값을 증가시킵니다.
int position = 0; while (1) { binary[position] = decimal % 2; // 배열에 나머지 저장 decimal = decimal / 2; // 2로 나눈 몫을 저장 position++; // 자릿수 변경
계속 반복하다가 decimal이 1이 되면 1을 2로 나눌 수가 없으므로 몫은 0이 됩니다. 이때 break로 반복문을 종료합니다.
if (decimal == 0) // 몫이 0이 되면 반복을 끝냄 break; }
가장 아래의 나머지부터 역순으로 읽어야 하므로 배열의 요소를 역순으로 출력해줍니다. 여기서 주의할 점은 배열의 인덱스가 0부터 시작하므로 position - 1부터 0까지 감소하도록 만들어야 합니다. 만약 position부터 반복하면 처음부터 배열을 벗어난 상태가 됩니다.
// 배열의 요소를 역순으로 출력 for (int i = position - 1; i >= 0; i--) { printf("%d", binary[i]); }
지금까지 배열을 선언하고 요소에 접근하는 방법을 배웠는데 C 언어는 배열부터 문법이 슬슬 복잡해지기 시작합니다. 일단 다른 부분보다 배열의 인덱스는 0부터 시작한다는 점만 기억하면 됩니다.