언어 자료구조 알고리즘/C언어 예제

16진수와 2진수 사이의 변환

언제나휴일 2009. 8. 19. 05:47
반응형

아무런 의미가 없을 수 있는 코드일 수 있지만 한 번쯤 두뇌를 회전시키는 연습을 하기에는 적당한 것 같다.

 

#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');
}


반응형

'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글

파서트리  (0) 2009.08.19
큰 수의 덧셈, 곱셈  (0) 2009.08.19
적분 공식을 이용하여 파이 구하기  (0) 2009.08.19
Visual C++ 표준 라이브러리 헤더파일  (0) 2009.08.19
singed 와 unsigned  (1) 2009.08.19
파서트리  (0) 2009.08.19
new 연산자 오버로딩  (0) 2009.08.19
퀵소트  (0) 2009.08.19
선택정렬  (0) 2009.08.19
삽입정렬  (0) 2009.08.19