easy software

C언어 배열을 이용하여 10진수를 2진수로 변환하기 본문

C언어/포인터와 배열

C언어 배열을 이용하여 10진수를 2진수로 변환하기

JAVA 웹개발자 2015. 1. 23. 14:11

이번에는 사용자로부터 정수하나를 입력받고

 

2진수로 변환하여 출력하는 예제를 해보도록 하겠습니다.

 

10진수에서 2진수로 변경하는 방법은 모두 아시리라 믿겠습니다.

 

10진수를 2진수로 변경하기 위해서 저는 배열을 선택했습니다.

 

만약 10진수 12를 2진수로 변환한다면, 12를 계속 2로나눈 나머지 값을

 

배열에 차례대로 저장하고, 그 배열을 역순으로 출력하면 2진수로 변환된 값이 나올 것입니다.

 

다만, 마지막에 남는 몫은 어떻게 하느냐가 문제인데요.

 

그 몫을 굳이 배열에 저장하기 보다는 0이 될때까지 값을 계속나눠서

 

나머지값을 계속 배열에 저장하는 방법을 추천드리고 싶습니다.

 

제 말이 이해가 되지 않을 수도 있는데요, 아래의 코드를 보시면 이해가 될겁니다.

 

주석도 친절하게 많이 달아놨으니 확인해보시기 바랍니다.

 

 

#include <stdio.h>

 

int main(void){

 

 int input;
 int arr[1000];//배열크기는 적당히 정해도 상관 없음
 int count = 0;

 

 printf("10진수 정수 입력 : ");
 scanf_s("%d", &input);

 

     /*배열에 input을 2로나눈 나머지값을 차례대로 저장(2진수 값이 거꾸로 저장됨)
     반복문의 조건을 input>1로 하게되면 제일 마지막에 값을 나눈 몫을 저장하지 못하므로
     0이 될 때 까지반복함*/ 
     for (int i = 0; input > 0; i++){
          arr[i] = input % 2;
          input = input / 2;
          count++;//count를 증가하여 후에 배열을 몇 번 반목할지를 결정
     }

 

 //배열에 저장된 값을 거꾸로 출력하여 정상적인 2진수 값 출력
 for (int i = count-1; i >= 0; i--)
  printf("%d ", arr[i]);
 

 return 0;


}

 

마지막 반복문에서 count-1을 왜 하는지 이해가 어려울 수 있습니다.

 

10진수 12를 2진수로 변환하면 1 1 0 0 이 됩니다.

 

그런데 count-1을 하지않고, 그냥 count까지 반복을하면 1 1 0 0 앞에 쓰레기 값이 같이 출력됩니다.

 

1 1 0 0 은 배열인덱스 3부터 0까지 출력해야 하는데, count초기값을 0으로 줬었죠?

 

12를 입력하고 첫 번째 반복문을 수행하면, count는 4가 되었을 겁니다.

 

12를 2로 나눈 나머지값은 배열에 차례대로 0 0 1 1 이 저장되었을 거고, 나머지 배열에는 쓰레기 값이

 

저장되었을 겁니다.

 

그 배열을 역순으로 출력하면 count를 0으로 초기화했기 때문에 4부터 0번인덱스까지 출력됩니다.

 

결국 필요없는 한개의 인덱스값이 같이 출력되는 것이죠.

 

그러므로 반복조건을 count-1로 설정하는 것입니다.

Comments