아무런 의미가 없을 수 있는 코드일 수 있지만 한 번쯤 두뇌를 회전시키는 연습을 하기에는 적당한 것 같다.
#include <stdio.h>
#include <string.h>
#include <process.h>
void PrintHexDigit(unsigned sum);//16진수 숫자 문자로 출력
void ConvertBinToHexInt(char *nums,unsigned u);//2진수를 16진수로 변환(정수부)
void ConvertBinToHexFlo(char *under,unsigned u);//2진수를 16진수로 변환(실수부)
void ConvertBinToHex(char *nums);//2진수를 16진수로 변환하여 출력
unsigned HexToDecimal(char hexdigit);//16진수 문자를 10진수로 변환
void ConvertHexToBinSub(char *nums,unsigned u);//16진수를 2진수로 변환-부호없는 정수만
void ConvertHexToBin(char *nums);//16진수를 2진수로 변환-소수점과 부호 포함
void main()
{
char nums[100];
printf("이진수를 입력하세요\n");
scanf("%s",nums);
ConvertBinToHex(nums);
printf("16진수를 입력하세요\n");
scanf("%s",nums);
ConvertHexToBin(nums);
}
//다음은 2진수를 16진수로 변환하여 출력하는 파트이다.
void PrintHexDigit(unsigned sum)
{
if((sum>=0)&&(sum<9))
{
putchar(sum + '0');
}
else
{
putchar(sum + 'a' - 10);
}
}
void ConvertBinToHexInt(char *nums,unsigned u)
{
unsigned sum = 0;
while(u)
{
sum = 0;
do
{
sum = sum<<1;
if(*nums == '1')
{
sum += 1;
}
else if(*nums != '0')
{
printf("변환할 수 없는 수가 있네요\n");
exit(0);
}
u--;
nums++;
}while(u%4);
PrintHexDigit(sum);
}
}
void ConvertBinToHexFlo(char *under,unsigned u)
{
unsigned sum = 0;
unsigned cnt = 0;
while(u)
{
cnt = 3;
sum = 0;
do
{
if(*(under+u-1) == '1')
{
sum += 1<<cnt;
}
else if(*(under+u-1) != '0')
{
printf("변환할 수 없는 수가 있네요\n");
exit(0);
}
u--;
cnt--;
}while(u%4);
PrintHexDigit(sum);
}
}
void ConvertBinToHex(char *nums)
{
unsigned u1 = 0; //정수부 자리수
unsigned u2 = 0; //소수부 자리수
char *under=0; //소수부 시작 위치
int sign = 0; //양의 수면 0, 음의 수면 1
unsigned lcnt = 0;
if(*nums == '-')//첫 부호가 -라면
{
sign = 1; //계산 결과
nums++; //부호 뒤부터 수이므로
putchar('-');
}
under = strstr(nums,".");
if(under) //소수점을 만났다면
{
under++; //.다음 위치를 가르키게 한다.
u1 = strlen(under);
u2 = -1;
}
u2 += strlen(nums) - u1;
ConvertBinToHexInt(nums,u2);
if(under)
{
putchar('.');
ConvertBinToHexFlo(under,u1);
}
putchar('\n');
} |
//다음은 16진수를 2진수로 변환하여 출력하는 파트이다.
unsigned HexToDecimal(char hexdigit)
{
unsigned num = 0;
if((hexdigit>='0')&&(hexdigit<='9'))
{
num = hexdigit - '0';
}
else if((hexdigit>='a')&&(hexdigit<='f'))
{
num = hexdigit - 'a' + 10;
}
else if((hexdigit>='A')&&(hexdigit<='F'))
{
num = hexdigit - 'A' + 10;
}
else
{
printf("변환할 수 없는 수가 있네요\n");
exit(0);
}
}
void ConvertHexToBinSub(char *nums,unsigned u)
{
unsigned num;
char buf[5]="";
int i;
for ( ; u ; nums++,u--)
{
num = HexToDecimal(*nums);
for(i=0; i<4; i++)
{
buf[i] = (num&1) +'0';
num = num>>1;
}
for(i=3;i>=0;i--)
{
putchar(buf[i]);
}
}
}
void ConvertHexToBin(char *nums)
{
unsigned u1 = 0; //정수부 자리수
unsigned u2 = 0; //소수부 자리수
char *under=0; //소수부 시작 위치
int sign = 0; //양의 수면 0, 음의 수면 1
unsigned lcnt = 0;
if(*nums == '-')//첫 부호가 -라면
{
sign = 1; //계산 결과
nums++; //부호 뒤부터 수이므로
putchar('-');
}
under = strstr(nums,".");
if(under) //소수점을 만났다면
{
under++; //.다음 위치를 가르키게 한다.
u1 = strlen(under);
u2 = -1;
}
u2 += strlen(nums) - u1;
ConvertHexToBinSub(nums,u2);
if(under)
{
putchar('.');
ConvertHexToBinSub(under,u1);
}
putchar('\n');
}
|