C언어 - 이진수 변환 예제

2020. 11. 11. 10:46개인공부/C언어

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
	10
	10 / 2 = 5, remainder = 0
	5 / 2 = 2, remainder = 1
	2 / 2 = 1, remainder = 0
	1 / 2 = 0, remainder = 1
*/

void print_binary(unsigned long n);
void print_binary_loop(unsigned long n);

int main() {

	unsigned long num = 10;

	print_binary_loop(num);
	print_binary(num);

	return 0;
}


//Note : printing order is reversed!
void print_binary_loop(unsigned long num)
{
	while (1)
	{
		int quotient = num / 2;
		int remainder = num % 2;

		printf("%d", remainder); // remainder is 0 or 1

		num = quotient;

		if (num == 0) break;
	}
	printf("\n");
}

	

void print_binary(unsigned long num)
{
	int remainder = num % 2;

	if (num >= 2)
		print_binary(num / 2);

	printf("%d", remainder); // 출력하는 부분이 recursion다음에 되있다.
	//재귀호출이 다시 되돌아가는 원리로 구현. 재귀호출과 스택 참조.

	return;
}


 

프로그래밍은 정말 아름다운거 같다. 

 

 

 

 

 

int main() {

	unsigned long num = 10;

	print_binary_loop(num);
	print_binary(num);

	return 0;
}

1. main()에서 num 변수를 스택에 올리고

2. print_binary_loop 함수에 인자 10을 보낸다.

 

 

void print_binary_loop(unsigned long num)
{
	while (1)
	{
		int quotient = num / 2;
		int remainder = num % 2;

		printf("%d", remainder); // remainder is 0 or 1

		num = quotient;

		if (num == 0) break;
	}
	printf("\n");
}

3. 10의 값을 지닌 num을 받은 print_binary_loop 는 while문을 실행하게 된다. ( if(num==0) break; 을 충족시키기 전까지 계속 반복된다.) 

 

4. int quotient 은 stack에 올라가고 num/2 의값 5를 가진다.

 

5. int remainder 는 stack에 올라가고 num %2 의값 1을 가진다.

 

6. printf("%d", remainder); 함수는 stack에 적재된 remainder의 값 1을 프린트 한다.

 

7. stack에 적재된 quotient의 값 5는 num변수에 대입된다.

 

8. if(num==0) break; 의 조건을 충족하지 못하므로 (stack에 올라온 print_bianry_loop의 num은 현재 5의 값을 지닌다.)

다시 while문을 실행하게 된다.

 

4~8의 과정을 반복한다.

 

num        : 10    5    2    1   0

quotient   :  5     2    1    0

remainder :  0     1    0    1     

 

위와 같이 값이 변하게 된다.

 

 

9. 마지막 num의 값이 0이 되었을때 if(num==0) break; 조건을 충족하게 되어 print_binary_loop문을 나가게 되고

다시 main() 함수로 돌아오고 다음 함수인  print_binary(num) 을 호출한다.

void print_binary(unsigned long num)
{
	int remainder = num % 2;

	if (num >= 2)
		print_binary(num / 2);

	printf("%d", remainder); 

	return;
}

  

10. 이때 num의 값은 0이 아니다. print_binary_loop의 변수 num의 값이 0이 되어 스택에서 사라지고 그 밑의 변수인 num은 10이다. 이 num의 10을 인자로 받아 실행한다.

 

11. remainder(첫번째) 변수가 스택위에 쌓인다. 10 % 2의 연산값으로 0이 된다. (나머지가 없으니)

 

12. if(num >=2) 의 조건을 충족하므로 print_binary(num / 2) 현재 num 10에서 나누기 2를 한 값인 5를 가지고 자신을 다시 호출한다.

 

13. stack 위에 num값 5가 쌓인다. 

 

14. 내부호출된 함수의 새로운 변수  remainder(두번째) 에 num값 5가 들어오고 num%2 연산을 실행한다. 연산값은 1이다.

 

15. if ( num >= 2 ) 의 조건을 충족한다. stack에 쌓인 num의 값이 아직 5이기에 print_bianry(num /2 )를 실행

num은 2가된다.

 

16. 내부호출된 함수에서 내부호출된 함수의 새로운 변수  remainder(세번째) 에 num값 2가 들어오고 num%2 연산을 실행한다. 연산값은 0이다.

 

17.  if ( num >= 2 ) 의 조건을 충족한다. stack에 쌓인 num의 값이 아직 2이기에 print_bianry(num /2 )를 실행

num은 1이된다.

 

18. 내부호출된 함수에서 내부호출된 함수에서 내부호출된 함수의 새로운 변수  remainder(네번째) 에 num값 1가 들어오고 num%2 연산을 실행한다. 연산값은 1이다

 

19. 이제 num의 값이 1이므로 if ( num >= 2 ) 의 조건을 충족하지 못하고 나온다.

 

20. printf("%d", remiainder) 에서 네번째 reaminder의 값  1을 출력

21. printf("%d", remiainder) 에서 세번째 reaminder의 값  0을 출력

22. printf("%d", remiainder) 에서 두번째 reaminder의 값  1을 출력

23. printf("%d", remiainder) 에서 첫번째 reaminder의 값  0을 출력

 

스택의 맨 윗부분 부터 읽어 들이면서 최종적으로 1010이 출력된다.

 

24. printf() 함수가 끝나고 return; 되어 print_binary 함수를 나간다.

 

25. main() 함수로 돌아와 return 0; 로 메인 함수 까지 끝나게 된다.

int main() {

	unsigned long num = 10;

	print_binary_loop(num);
	print_binary(num);

	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 홍정모의 따라배우는 C언어