C語言 進制轉換

整個代碼互轉只有3個函數

  • ToHexNum

  • ToDecNum

  • ToBiNum
    因爲我代碼中二進制和十六進制可以通過十進制間接轉換,所以實際上只要寫

  • 十進制 <->二進制

  • 十進制<->十六進制進制
    而十進制<->十六進制,是由上面兩個轉換組合而來,即二進制<->十進制<->十六進制

//如果你願意的話,也可以用十進制<->二進制<->十六進制的順序來編寫

先貼一下截圖
輸入的時候,除了二進制外後綴都需要加上對應格式縮寫
十進制輸入格式: xxxxd或者xxxxD
十六進制格式: xxxxh或者xxxxH
二進制格式: xxxxx (沒有後綴)
在這裏插入圖片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

//the type of number
#define HEX 1
#define DEC 2
#define BIN 3
#define DEBUG 0
typedef struct{
    void *base;
    void *top;
    int len;
}stack;
int num_dec=0;

int ToHexNum(char *num,const int type,const int len)
{
    if(type==2)//DEC to hex
    {
        stack *s=(stack *)malloc(sizeof(stack)); s->len=0;
        char *base_p=(char *)s->base;
        char *top_p=(char *)s->top;

        base_p=(char *)malloc(len*sizeof(char));
        top_p=base_p;  
        if(num_dec==0)
        {
            int i=0;
            int power=1;
            while(i<len)//char number to int number;
            {
                num_dec+=power*(num[len-i-1]-48);
                power*=10;
                i++;
            }
        }
        while(num_dec!=0)
        {
            switch(num_dec%16)
            {
                case 10:*top_p++='A';break;
                case 11:*top_p++='B';break;
                case 12:*top_p++='C';break;
                case 13:*top_p++='D';break;
                case 14:*top_p++='E';break;
                case 15:*top_p++='F';break;
                default:*top_p++=num_dec%16+'0';break;
            }
            num_dec/=16;
            s->len++;
        }
        printf("\tHex:[");
        --top_p;
        while(s->len>0)
        {
            printf("%c",*top_p--);
            s->len--;
        }
        printf("]\n");
        free(base_p);
        free(s);


    }
    if(type==3)//Bin to hex
    {
        num_dec=ToDecNum(num,type,len);
        ToHexNum(num,DEC,len);
    }
    return 1;
}
int ToDecNum(char *num,const int type,const int len)//done
{
    int power=len;
    int result=0;

    #if DEBUG
    puts("\nTesting contents:");
    puts(num);
    printf("type=%d,len=%d",type,len);
    #endif

    if(type==1)//hex
    {
        power-=2;
        while(power>=0)
        {
            if(num[len-power-2]<=57)
            {
                #if DEBUG
                printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-48,pow(16,power),power);
                #endif

                result+=(num[len-power-2]-48)*pow(16,power);
            }
            else if(num[len-power-2]<=90)
            {
                #if DEBUG
                printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-55,pow(16,power),power);
                #endif

                result+=(num[len-power-2]-55)*pow(16,power);
            }
            else
            {
                #if DEBUG
                printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-87,pow(16,power),power);
                #endif

                result+=(num[len-power-2]-87)*pow(16,power);
            }
            --power;
        }
    }

    if(type==3)//binary
    {
        power-=1;
        while(power>=0)
        {
            #if DEBUG
            printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-1],num[len-power-1]-47,pow(2,power),power);
            #endif

            result+=(num[len-power-1]-48)*pow(2,power);
            --power;
        }
    }
    printf("\tDec:[%d]\n",result);
    return result;
}

int ToBiNum(char *num,const int type,const int len)//working
{
   
    if(type==1)//hex to bin
    {
        num_dec=ToDecNum(num,type,len);
        //printf("num_dec:%d\n",num_dec);
        ToBiNum(num,DEC,len);
    }
    if(type==2)//dec to bin
    {
        stack *s=(stack *)malloc(sizeof(stack)); s->len=0;
        int *base_p=(int *)s->base;
        int *top_p=(int *)s->top;

        base_p=(int *)malloc(4*len*sizeof(int));
        top_p=base_p;

        if(num_dec==0)
        {
            int i=0;
            int power=1;
            while(i<len)//char to int;
            {
                if(num[len-i-1]<'0'||num[len-i-1]>'9')
                    continue;

                num_dec+=power*(num[len-i-1]-48);
                power*=10;
                i++;
            }
        }
        while(num_dec!=0)
        {
            *top_p++=num_dec%2;
            num_dec/=2;
            s->len++;
        }
        printf("\tBin:[");
        --top_p;
        while(s->len>0)
        {
            printf("%d",*top_p--);
            s->len--;
        }
        printf("]\n");
        free(base_p);
        free(s);
    }



    return 1;
}

int NumConversion()
{
    int len=1;
    char *num;
    while(len!=0)
    {
        num=(char *)malloc(20*sizeof(char));
        puts("[**Input]:");
        scanf("%s",num);
        len=strlen(num);
        if(num[len-1]=='D'||num[len-1]=='d')
        {//decimal input
            ToBiNum(num,DEC,len-1);
            ToHexNum(num,DEC,len-1);
        }
        else if(num[len-1]=='H'||num[len-1]=='h')
        {//hex input
            ToBiNum(num,HEX,len);
        }
        else
        {//binary input
            ToHexNum(num,BIN,len);
        }
        free(num);
        num=NULL;
    }
    if(num!=NULL)
    {
        free(num);
    }

    return 1;
}
int main()
{
    NumConversion();
    return 1;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章