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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值