C语言进制转换


前言

闲着没事写写玩玩的。

目录

1.十进制二进制/八进制/十六进制
2.二进制/八进制/十六进制十进制
3.二进制/八进制/十六进制之间的互相转换

1.十进制转二进制/八进制/十六进制

1.1.十进制转二进制

数学上的方法是除以2,倒取余数,例如:

按照从下往上的顺序写,就是1010.

那么代码上面,只需要一个循环即可:

while(dec){
	bin[k]=dec%2;
	dec/=2;
	k++;
}

注意是倒取余数,因此输出的时候翻转一下即可,从k-1到0.

#include
#include

int dec;
int bin[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		bin[k]=dec%2;
		dec/=2;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		printf("%d",bin[i]);
	}
}

1.2.十进制转八进制

毫无难度,和之前上面的写法一样,只是把2换成8.

#include
#include

int dec;
int oct[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		oct[k]=dec%8;
		dec/=8;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		printf("%d",oct[i]);
	}
}

1.3.十进制转十六进制

注意:十六进制中包含数码ABCDEF,因此输出时需要经过特殊转换。方法是在输出的时候加上一个switch case。

#include
#include

int dec;
int hex[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		hex[k]=dec%16;
		dec/=16;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		if(hex[i]<=9)printf("%d",hex[i]);
		else{
			switch(hex[i]){
				case 10:putchar('A');break;
				case 11:putchar('B');break;
				case 12:putchar('C');break;
				case 13:putchar('D');break;
				case 14:putchar('E');break;
				case 15:putchar('F');break;
			}
		}
	}
}

2.二进制/八进制/十六进制转十进制

2.1.二进制转十进制

二进制的每一位都有对应的权值,类似十进制个位表示1,十位表示10,百位表示100等,二进制第一位表示1,第二位2,第三位4,第四位8,以此类推。

如图,把每一位权值乘以这一位的数字即可。

注意在写的时候,语法方面的一些小问题,写在注释里面了:

#include
#include
#include

int dec;
char bin[100];
int main(){
	fgets(bin,sizeof(bin),stdin);
	//也可用gets(bin)代替,但是gets被标准列为不安全的函数,并且在部分环境会报错
	int p=1;//权值 
	for(int i=strlen(bin)-2;i>=0;i--){
		//这里从strlen(bin)-2开始,因为fgets会把换行符一起读入进来,从strlen(bin)-1开始会有问题 
		dec+=p*(bin[i]-'0');
		p*=2;
	}
	printf("%d",dec);
}

2.2.八进制转十进制

只是把权值从每次乘2到乘8,其他无变化。

#include
#include
#include

int dec;
char oct[100];
int main(){
	fgets(oct,sizeof(oct),stdin);
	int p=1;//权值 
	for(int i=strlen(oct)-2;i>=0;i--){
		dec+=p*(oct[i]-'0');
		p*=8;
	}
	printf("%d",dec);
}

2.3.十六进制转十进制

注意,这里十六进制中有A-F的字母,这里我考虑用到一个办法,使用ref数组,ref[c]就表示c字符对应的数字,例如ref['A']=10。
代码如下,最前面预处理了ref数组的值。

#include
#include
#include

int dec;
char hex[100];
int ref[255];
int main(){
	for(int i='0';i<='9';i++){
		ref[i]=i-'0';
	}
	for(int i='A';i<='F';i++){
		ref[i]=i-'A'+10;
	}
	fgets(hex,sizeof(hex),stdin);
	int p=1;//权值 
	for(int i=strlen(hex)-2;i>=0;i--){
		dec+=p*ref[hex[i]];
		p*=16;
	}
	printf("%d",dec);
}

3.二进制/八进制/十六进制之间的互相转换

我们知道,这类进制之间的转换,可以使用三/四位一段的方法,例如:

就是把0x1234转二进制的结果。

这里只以十六进制转二进制为例,我们可以使用数组存储。

#include
#include
#include

char* bin[16]={
	"0000","0001","0010","0011","0100","0101","0110","0111",
	"1000","1001","1010","1011","1100","1101","1110","1111",
};

char hex[100];
int ref[255];
int main(){
	for(int i='0';i<='9';i++){
		ref[i]=i-'0';
	}
	for(int i='A';i<='F';i++){
		ref[i]=i-'A'+10;
	}
	fgets(hex,sizeof(hex),stdin);
	for(int i=0;i

全文完。