#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이 됩니다!!
