#include <stdio.h> // 2진수 -> 10진수 변환 (반복적 버전: 배열) void two_to_ten(unsigned n) { // 동적 배열 생성 int size = 1; int *a = (int*)calloc(sizeof(int)*size); // 배열에 원소 넣기 ex) 123 => 3 2 1 for (int i = 0; n != 0; i++) { a[i] = n % 10; n /= 10; if (n != 0) { size++; a = realloc(a, sizeof(int)*size); } } // sum에 (배열 원소*2^i) 더해서 출력 unsigned sum = 0; unsigned b = 1; for (int i = 0; i < size; i++) { sum = sum + (a[i] * b); b = b * 2; } printf("%u ", sum); free(a); } int main() { unsigned num = 0; printf("-1 입력시 종료됩니다.\n\n"); while (num != -1) { printf("이진수를 입력하세요 \n(1111111111까지 처리 가능): "); scanf_s("%u", &num); printf("\n\n반복적 버전 : 배열\n"); two_to_ten(num); // 반복적 버전 : 배열 printf("\n\n"); } return 0; }
2진수를 10진수로 변환하기 위해서 먼저 비트별로 배열에 값을 저장했습니다.
ex) 1011 -> a[0]=1, a[1]=1, a[2]=0, a[3]=1 (거꾸로 저장)
위는 n(사용자 입력 값)을 10으로 나눈 나머지를 배열 원소에 저장하고.
n은 10으로 나눈 몫으로 갱신하는 작업을 반복하면 해결됩니다!
(n!=0)
2진수를 10진수로 바꾸는 일상적인 방법은 각 비트에 2를 곱하는 것입니다.
첫 번째 비트는 2^0을 곱하고,
n번째 비트는 2^(n-1)을 곱합니다!
모든 비트에 다 곱했으면 이를 다 더하면 완성입니다!
결국 (1*2^0) + (1*2^1) + (0*2^2) + (1*2^3) = 11이 됩니다!!