이진수를 십진수로 바꾸는 연습문제
이진수를 십진수로 바꾸는 함수를 구현해볼 것임.
#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
로 캐스팅도 함.
이런 조언도 해줌…
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
십진수를 이진수로 바꾸는 연습문제
#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");
}