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