#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define DEC 10#define HEX 16#define BIN 2#define OCT 8#define MAX 32unsigned long int binToUl(const char *binr){ int i=0,n=strlen(binr)-1; unsigned long int rt=0; for (i = 0; n-i>=0; i++) { if (binr[n-i]=='1') rt+=(unsigned long int)floor(pow(2,i)); } return rt;}unsigned long int getNum(const char *num ,const int type){ unsigned long int number; switch (type) { default: number=-1; case DEC:sscanf(num,"%lu",&number);break; case HEX:sscanf(num,"%lx",&number);break; case OCT:sscanf(num,"%lo",&number);break; case BIN: number=binToUl(num); } return number;}char *toBin(const char *num,const int type){ char *ret=NULL; int i,n,mask; unsigned long int number=getNum(num,type); n=(int)floor(log(number)/log(2))+1; mask= 1<<n; ret=malloc(sizeof(char)*(n+1)); for (i = 0; i<=n; i++) { ret[i]= (number&mask)?'1':'0'; number<<=1; } ret[n+1]=0; return ret;}char *toHex(const char *num,const int type){ unsigned long int number=getNum(num,type); char *rt=malloc(sizeof(char)*((int)floor(log(number)/log(16))+1)); sprintf(rt,"%X",number); return rt;}char *toOct(const char *num,const int type){ unsigned long int number=getNum(num,type); char *rt=malloc(sizeof(char)*((int)floor(log(number)/log(8))+1)); sprintf(rt,"%o",number); return rt;}void change(const char *num,const int type){ switch (type) { default: fprintf(stderr,"ERROR,type %d is not defined!",type); case DEC: printf("DEC:%s\nBIN:%s\nHEX:%s\nOCT:%s\n",num,toBin(num,type),toHex(num,type),toOct(num,type)); break; case HEX: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),toBin(num,type),num,toOct(num,type)); break; case BIN: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),num,toHex(num,type),toOct(num,type)); break; case OCT: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),toBin(num,type),toHex(num,type),num); }}int main(void){ char num[MAX]; int type; scanf("%79s",num);/*输入原数字,无符号整数形式*/ scanf("%d",&type);/*输入原数字的进制,10表示十进制,16表示十六进制,8表示八进制,2表示二进制,可以在程序开始处的宏定义中修改*/ change(num,type); /*转换并输出*/ return 0;}
十六位进制数的转换;纠结了
最新推荐文章于 2022-06-23 08:47:29 发布