33.9 배열을 활용하여 10진수를 2진수로 변환하기

이번에는 배열을 응용해서 10진수를 2진수로 변환한 뒤 배열에 넣어보겠습니다. 그런데 10진수에서 2진수로는 어떻게 변환할까요?

방법은 간단합니다. 10진수를 0이 될 때까지 2로 계속 나눈 뒤 나머지를 역순으로 읽으면 2진수가 됩니다.

예를 들어 13을 2진수로 변환한다면 13을 2로 나누면 몫은 6이 나오고 나머지는 1이 나옵니다. 6은 13 아래에 적고 1은 6 옆에 적습니다. 이런 식으로 계속 2로 나누어서 몫과 나머지를 구하여 몫이 0이 나오면 가장 아래의 나머지부터 역순으로 읽습니다. 여기서는 1101이 되겠죠?

그림 33‑3 10진수를 2진수로 변환하기

이제 이 식을 코드로 표현해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

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부터 시작한다는 점만 기억하면 됩니다.