이진수를 십진수로 바꾸는 연습문제

이진수를 십진수로 바꾸는 함수를 구현해볼 것임.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> //pow()
#include <string.h> // strlen()
#include <stdlib.h> // exit()

unsigned char to_decimal(const char bi[]);

int main()
{
	printf("Binary (string) to decimal conversion\\n");

	printf("%d\\n", to_decimal("00000110"));
	printf("%d\\n", to_decimal("00010110"));

	// note : ^(caret) means power in math
	// power in c : (int)pow(2, 3) == 8

	printf("%d\\n", to_decimal("10010100"));

	return 0;
}

unsigned char to_decimal(const char bi[])
{
	int ret_val = 0;
	int count = strlen(bi);
		
	for (int i = (count-1); i >= 0; --i)
	{
		if (bi[i] == '1')
		{
			ret_val += pow(2, **(count-1) - i**);
		}
	}

	return ret_val;
}

구현했다.

, for문을 감소하는 방식으로 오랜만에 사용하면서 깨달은 게 하나 있음. for문은 조건식이 참일때 작동한다. 조건식은 탈출 조건이 아님… 이걸 오해해서 시간이 좀 걸렸다.

홍정모님의 코드는 나와 조금 달랐음.

unsigned char to_decimal_hong(const char bi[])
{
	const size_t bits = strlen(bi);
	unsigned char sum = 0;
	for (size_t i = 0; i < bits; ++i)
	{
		if(bi[i] =='1')
			sum += (int)pow(2, **bits - 1 - i**);
		else if (bi[i] != '0')
		{
			printf("Wrong character : %c", bi[i]);
			exit(1);
		}

	}

	return sum;
}

pow()를 다루는 구조는 같았음. 다만 나는 0의 자리부터 출발해 계산하는 방식이라 for문 에서 감소연산자를 사용했고, 홍정모님은 가장 큰 자리수부터 계산하는 방식으로 하심. 난 그러면 복잡해질거라고 생각했는데, 생각해보니 전혀 그럴건 없었음. 어차피 합으로 계산되는거라 교환법칙이 성립하기 때문임.

그리고 나보다 안전장치를 더 많이 구현하심.

반환값을 unsigned로 맞춰주었고, size_t를 사용해 이식성도 높임. size_t는 앞으로 더 자주 사용하게 될 것이므로 주의하자.

또한 pow는 실수형으로 결과를 반환하기 때문에 int로 캐스팅도 함.

Untitled

이런 조언도 해줌…

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

십진수를 이진수로 바꾸는 연습문제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> //pow()
#include <string.h> // strlen()
#include <stdlib.h> // exit()
#include <stdbool.h>

unsigned char to_decimal(const char bi[]);
void print_binary(const unsigned char num);

int main()
{
	unsigned char i = to_decimal("01000110");
	unsigned char mask = to_decimal("00000101");

	print_binary(i);
	print_binary(mask);
	print_binary(i & mask);

	return 0;
}

unsigned char to_decimal(const char bi[])
{
	const size_t bits = strlen(bi);
	unsigned char sum = 0;
	for (size_t i = 0; i < bits; ++i)
	{
		if (bi[i] == '1')
			sum += (int)pow(2, bits - 1 - i);
		else if (bi[i] != '0')
		{
			printf("Wrong character : %c", bi[i]);
			exit(1);
		}

	}

	return sum;
}

void print_binary(const unsigned char num)
{
	printf("Decimal\\t %d\\t == Binary ", num);
	char binary[] = "00000000";

	for (int i = 8; i >= 0; i--)
	{
		int n = (int)pow((double)2, (double)i);

		if ((num & n) == n)
		{
			printf("1");
		}
		else if ((num & n) != n)
		{
			printf("0");
		}
		else
		{
			printf("error!\\n");
			exit(1);
		}
	}
	printf("\\n");

}