二进制,八进制,十进制与十六进制之间的相互转换

功能:完成二进制,八进制,十进制与十六进制之间的相互转换(以字符数组形式输入)。

要点:

字符数组反序:strrev(char *str);

字符数组转换为十进制整数:atoi(char *str);

map容器完成字符到数值的转换;

字符数组完成数值到字符的转换;

1位16进制数可转换为4位2进制数

1位8进制数可转换为3位2进制数

使用右移和与运算代替除法和取余


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<map>
#include<bitset>
#include<algorithm>
using namespace std;

map<char,int> char_to_int;
char int_to_char[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

void init();
void convert(int i,int j,char d[],int s);
void B_O(char d[],int s);
void B_D(char d[],int s);
void B_X(char d[],int s);
void O_B(char d[],int s);
void O_D(char d[],int s);
void O_X(char d[],int s);
void D_B(char d[],int s);
void D_O(char d[],int s);
void D_X(char d[],int s);
void X_B(char d[],int s);
void X_O(char d[],int s);
void X_D(char d[],int s);

int main(){
    int i,j,s;
    char d[100];
    printf("+=============================================================+\n");
    printf("|                      进  制  转  换                         |\n");
    printf("+=============================================================+\n");

    init();
    while(1){
        printf("\n0.退出\n1.二进制\n2.八进制\n3.十进制\n4.十六进制\n请选择被转换的进制:");
        scanf("%d",&i);
        if (i==0)   break;
        printf("\n0.退出\n1.二进制\n2.八进制\n3.十进制\n4.十六进制\n请选择转换后的进制:");
        scanf("%d",&j);
        if (j==0)   break;
        printf("\n请输入需要转换的数:");
        fflush(stdin);gets(d);
        s=strlen(d);
        if (s==0)   break;
        convert(i,j,d,s);
    }
    return 0;
}

void init(){
    for(int i=0;i<10;i++)
        char_to_int['0'+i]=i;
    for(int i=0;i<6;i++)
        char_to_int['a'+i]=i+10;
}

void convert(int i,int j,char d[],int s){
    if (i==1&&j==2){
        printf("二进制转换为八进制:");
        B_O(d,s);
    }
    else if(i==1&&j==3){
        printf("二进制转换为十进制:");
        B_D(d,s);
    }
    else if(i==1&&j==4){
        printf("二进制转换为十六进制:");
        B_X(d,s);
    }
    else if(i==2&&j==1){
        printf("八进制转换为二进制:");
        O_B(d,s);
    }
    else if(i==2&&j==3){
        printf("八进制转换为十进制:");
        O_D(d,s);
    }
    else if(i==2&&j==4){
        printf("八进制转换为十六进制:");
        O_X(d,s);
    }
    else if(i==3&&j==1){
        printf("十进制转换为二进制:");
        D_B(d,s);
    }
    else if(i==3&&j==2){
        printf("十进制转换为八进制:");
        D_O(d,s);
    }
    else if(i==3&&j==4){
        printf("十进制转换为十六进制:");
        D_X(d,s);
    }
    else if(i==4&&j==1){
        printf("十六进制转换为二进制:");
        X_B(d,s);
    }
    else if(i==4&&j==2){
        printf("十六进制转换为八进制:");
        X_O(d,s);
    }
    else if(i==4&&j==3){
        printf("十六进制转换为十进制:");
        X_D(d,s);
    }
    else{
        printf("等进制转换:");
        printf("%s\n",d);
    }
    printf("*************************************************************\n");
}

void B_O(char d[],int Size){
    int i,result;
    strrev(d);
    while(Size%3!=0)
        d[Size++]='0';
    for(i=Size-1;i>=0;i-=3){
        result=(char_to_int[d[i]]<<2) + (char_to_int[d[i-1]]<<1) + char_to_int[d[i-2]];
        printf("%c",int_to_char[result]);
    }
}

void B_D(char d[],int Size){
    int i,j;
    int result=0;
    for(i=Size-1,j=0;i>=0;i--,j++)
        result += (char_to_int[d[i]]<<j);
    printf("%d\n", result);
}

void B_X(char d[],int Size){
    int i,result;
    strrev(d);
    while(Size%4!=0)
        d[Size++]='0';
    for(i=Size-1;i>=0;i-=4){
        result=(char_to_int[d[i]]<<3) + (char_to_int[d[i-1]]<<2) + (char_to_int[d[i-2]]<<1) + char_to_int[d[i-3]];
        printf("%c",int_to_char[result]);
    }
}

void O_B(char d[],int Size){
    int i,temp;
    temp=char_to_int[d[0]];
    if(temp>>2){
        printf("1");
        temp &= 3;
        printf("%d",temp>>1);temp &= 1;
        printf("%d",temp);
    }
    else if(temp>>1){
        printf("1");
        temp &= 1;
        printf("%d",temp);
    }
    else
        printf("%d",temp);

    for(i=1;i<Size;i++){
        temp=char_to_int[d[i]];
        printf("%d",temp>>2);temp &= 3;
        printf("%d",temp>>1);temp &= 1;
        printf("%d",temp);
    }
    printf("\n");
}

void O_D(char d[],int Size){
    int i,j,result=0;
    for(i=Size-1,j=0;i>=0;i--,j+=3)
        result += (char_to_int[d[i]]<<j);
    printf("%d\n", result);
}

void O_X(char d[],int Size){
    int i,j,k=0,result=0;
    char show[100];
    for(i=Size-1,j=0;i>=0;i--,j+=3)
        result += (char_to_int[d[i]]<<j);
    while(result){
        show[k++]= int_to_char[result & 15];
        result = result>>4;
    }
    show[k]='\0';
    strrev(show);
    printf("%s\n",show);
}

void D_B(char d[],int Size){
    int j,value=atoi(d);
    bitset<100> p;
    for(j=0;value;j++){
        p[j]=value&1;
        value=value>>1;
    }
    while(--j>=0)
        printf("%d",p.test(j));
    printf("\n");
}

void D_O(char d[],int Size){
    int j,value=atoi(d);
    char p[30];
    for(j=0;value;j++){
        p[j]=value&7;
        value=value>>3;
    }
    while(--j>=0)
        printf("%d",p[j]);
    printf("\n");
}

void D_X(char d[],int Size){
    int j,value=atoi(d);
    char p[30];
    for(j=0;value;j++){
        p[j]=int_to_char[value&15];
        value=value>>4;
    }
    while(--j>=0)
        printf("%c",p[j]);
    printf("\n");
}

void X_B(char d[],int Size){
    int i,temp;
    temp=char_to_int[d[0]];
    if(temp>>3){
        printf("1");
        temp &= 7;
        printf("%d",temp>>2);temp &= 3;
        printf("%d",temp>>1);temp &= 1;
        printf("%d",temp);
    }
    else if(temp>>2){
        printf("1");
        temp &= 3;
        printf("%d",temp>>1);temp &= 1;
        printf("%d",temp);
    }
    else if(temp>>1){
        printf("1");
        temp &= 1;
        printf("%d",temp);
    }
    else
        printf("%d",temp);

    for(i=1;i<Size;i++){
        temp=char_to_int[d[i]];
        printf("%d",temp>>3);temp &= 7;
        printf("%d",temp>>2);temp &= 3;
        printf("%d",temp>>1);temp &= 1;
        printf("%d",temp);
    }
    printf("\n");
}

void X_O(char d[],int Size){
    int i,j,k=0,result=0;
    char show[100];
    for(i=Size-1,j=0;i>=0;i--,j+=4)
        result += (char_to_int[d[i]]<<j);
    while(result){
        show[k++]= int_to_char[result & 7];
        result = result>>3;
    }
    show[k]='\0';
    strrev(show);
    printf("%s\n",show);
}

void X_D(char d[],int Size){
    int i,j,result=0;
    for(i=Size-1,j=0;i>=0;i--,j+=4)
        result += (char_to_int[d[i]]<<j);
    printf("%d\n",result);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值