整個代碼互轉只有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;
}