功能:完成二进制,八进制,十进制与十六进制之间的相互转换(以字符数组形式输入)。
要点:
字符数组反序: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); }