C语言 - 各个进制之间的相互转换

目录

一、二进制

[1.二进制 >> 八进制](#1.二进制 >> 八进制)

[2.二进制 >> 十进制](#2.二进制 >> 十进制)

[3. 二进制 >> 十六进制](#3. 二进制 >> 十六进制)

二、八进制

[1.八进制 >> 二进制](#1.八进制 >> 二进制)

[2.八进制 >> 十进制](#2.八进制 >> 十进制)

[3.八进制 >> 十六进制](#3.八进制 >> 十六进制)

三、十进制

[1.十进制 >> 二进制](#1.十进制 >> 二进制)

[2.十进制 >> 八进制](#2.十进制 >> 八进制)

[3.十进制 >> 十六进制](#3.十进制 >> 十六进制)

四、十六进制

[1.十六进制 >> 二进制](#1.十六进制 >> 二进制)

[2.十六进制 >> 八进制](#2.十六进制 >> 八进制)

[3.十六进制 >> 十进制](#3.十六进制 >> 十进制)

一、二进制

1.二进制 >> 八进制

方法一:可以通过先将二进制转换为十进制,然后再将十进制转换为八进制的方式来间接实现

方法二:直接按每三位一组处理二进制数,并直接转换为对应的八进制数

下面为方法一的代码:

cs 复制代码
int Convert2_10(long long n)  //先将二进制数转成十进制
{
	int i = 0;   //用于表示第几位二进制数
	int n_10 = 0;  //得到的十进制数
	int ret = 0;  //每次取余后的数

	while (n != 0)
	{
		ret = n % 10;
		n /= 10;
		n_10 += ret*pow(2, i);
		i++;
	}
	return n_10;  

}

int Convert2_10_8(int n) //将得到的十进制数转成八进制数
{
	int i = 1;
	int n_10 = Convert2_10(n);
	int n_8 = 0;

	while (n_10 != 0)
	{
		n_8 += (n_10 % 8) * i;
		n_10 /= 8;
		i *= 10;
	}
	return n_8;
}

int main()
{
	long long n_2 = 0;    //对于 long long,应该使用 %lld打印
	int n_8 = 0;

	printf("请输入一个二进制数:");
	scanf("%d", &n_2);

	n_8 = Convert2_10_8(n_2);
	printf("二进制数%lld转换为八进制数为:%d\n", n_2, n_8);

	return 0;
}

2.二进制 >> 十进制

cs 复制代码
int Convert2_10(const char* n)
{
	int sum = 0;
	int length = strlen(n);

	for (int i = 0; i < length; i++)
	{
		sum += (n[i] - '0') * pow(2, length - i - 1);
	}
	return sum;
}

int main()
{
	char n[100]; // 假设二进制数不超过99位 
	int ret = 0;

	printf("请输入一个二进制数:");
	scanf("%99s", &n);  

	// 检查输入是否有效(只包含'0'和'1')  
	for (int i = 0; n[i] != '\0'; i++) 
	{
		if (n[i] != '0' && n[i] != '1') 
		{
			printf("输入的不是有效的二进制数!!!\n");
			return 1;
		}
	}
	
	ret = Convert2_10(n);
	printf("二进制数%s转换为十进制数为:%d\n", n, ret);
	return 0;
}

3. 二进制 >> 十六进制

两种方法:

方法一:限制输入标准的二进制数,必须是4的倍数

cs 复制代码
char* convert2_16(const char* n)
{
	size_t len = strlen(n);   //计算二进制数的长度
	if (len == 0 || len % 4 != 0)   // 如果输入为空或长度不是4的倍数,则返回NULL
	{
		return NULL;
	}

	// 分配足够的空间来存储转换后的十六进制字符串(包括结尾的'\0')
	//长度为二进制长度除以4(因为4位二进制等于1位十六进制)加1(为'\0')
	char* hex = (char*)malloc((len / 4) + 1);
	if (!hex)
	{
		return NULL;
	}

	// 遍历二进制字符串,每次处理4个字符
	size_t i, j = 0;
	for (i = 0, j = 0; i < len; i += 4, j++)
	{
		unsigned n_16 = 0;
		for (size_t k = 0; k < 4; k++)
		{
			n_16 = n_16 * 2 + (n[i + k] - '0');
		}
		// 将计算出的十六进制值转换为对应的字符,并存储在结果字符串中
		hex[j] = "0123456789ABCDEF"[(int)n_16];
	}
	hex[j] = '\0';   // 添加字符串结束符 
	return hex;
}
int main()
{
	char n_2[65];   // 假设二进制数不超过64位
	printf("请输入一个二进制数:");
	scanf("%64s", &n_2);   // 读取输入的二进制字符串(最多64位) 

	char* hex = convert2_16(n_2);
	printf("二进制数%s转换成十六进制数为:0x%s\n",n_2, hex);
	free(hex); // 释放之前分配的内存

	return 0;
}

方法二:无限制输入的字符个数

cs 复制代码
int main()
{
	long long n_2 = 0;
	long int n_16 = 0;
	int i = 1;
	int remainder = 0;

	printf("请输入一个二进制数: ");
	scanf("%lld", &n_2);

	while (n_2 != 0)
	{
		remainder = n_2 % 10;
		n_16 = n_16 + remainder * i;
		i = i * 2;
		n_2 = n_2 / 10;
	}

	printf("转换得到的十六进制数为: %lX\n", n_16);

	return 0;
}

二、八进制

1.八进制 >> 二进制

思路:先把八进制数转成十进制数,再转换成二进制数

cs 复制代码
int convert8_10(int n)   //8 >> 10
{
	int n_10 = 0;
	int i = 0;

	while (n != 0)
	{
		n_10 += (n % 10) * pow(8, i);
		i++;
		n /= 10;
	}
	return n_10;

}

long long convert8_10_2(int n)  //10 >> 2
{
	long long n_2 = 0;
	int n_10 = convert8_10(n);   //得到十进制数
	int i = 1;

	while (n_10 != 0)
	{
		n_2 += (n_10 % 2) *i;
		n_10 /= 2;
		i *= 10;
	}
	return n_2;
}

int main()
{
	int n_8 = 0;
	long long n_2 = 0;

	printf("请输入一个八进制数:");
	scanf("%d", &n_8);

	n_2 = convert8_10_2(n_8);
	printf("八进制数%d转换为二进制数为:%lld\n", n_8, n_2);

	return 0;
}

2.八进制 >> 十进制

例子:1234(8进制)= 1*8^3+2*8^2+3*8^1+4*8^0=668(10进制)。

cs 复制代码
int Convert8_10(long long n)
{
	int num = 0; 
	int i = 0;

	while (n != 0)
	{
		num += (n % 10) * pow(8, i);
		i++;
		n /= 10;
	}
	return num;
}

int main()
{
	int n_8 = 0;
	int n_10 = 0;

	printf("请输入一个八进制数:");
	scanf("%d", &n_8);

	n_10 = Convert8_10(n_8);
	printf("八进制数%d转换为十进制数为:%d\n", n_8, n_10);
	return 0;
}

3.八进制 >> 十六进制

C语言中转换八进制到十六进制可以使用sprintf()函数。

cs 复制代码
int main()
{
	long n_8 = 0;
	char n_16[10];
	printf("请输入一个八进制数:");
	scanf("%o", &n_8);

	sprintf(n_16, "%X", n_8);

	printf("八进制数%o转换成十六进制数为:%s\n", n_8, n_16);

	return 0;
}

三、十进制

1.十进制 >> 二进制

cs 复制代码
/两个参数:一个十进制数n;一个指向字符数组(字符串)的指针binary,这个字符数组将用于存储转换后的二进制数。
void Convert10_2(int n, char *binary)   
{
	int i = 0;    // 用于跟踪在binary数组中当前的位置
	 
	while (n > 0) 
	{
		binary[i++] = (n % 2) + '0'; 
		//计算n除以2的余数,这个余数就是n的二进制表示中的最低位
		//然后将这个余数加上字符'0'的ASCII码值,将其转换为对应的字符'0'或'1'
		// 并将这个字符存储在binary数组的当前位置

		n /= 2;
		// 更新n为n除以2的商,为下一次迭代准备 
	}

	// 添加字符串结束符  
	binary[i] = '\0';

	// 因为我们是从最低位开始存储的,所以需要反转字符串  
	int start = 0;
	int end = i - 1;
	while (start < end)
	{
		char temp = binary[start];
		binary[start] = binary[end];
		binary[end] = temp;
		start++;
		end--;
	}
}

int main()
{
	int n_10 = 0;
	char n_2[33]; // 假设整数不超过32位  

	printf("请输入一个十进制数:");
	scanf("%d", &n_10);

	Convert10_2(n_10, n_2);
	printf("十进制数%d转换为二进制数为:%s\n", n_10, n_2);
	return 0;
}

2.十进制 >> 八进制

cs 复制代码
long convert10_8(int n)
{
	int n_8 = 0, i = 1;

	// 从十进制数开始迭代
	while (n != 0)
	{
		n_8 += (n % 8) * i;
		n /= 8;
		i *= 10;
	}
	return n_8;
}

int main()
{
	int n_10;

	printf("请输入一个十进制数: ");
	scanf("%d", &n_10);

	long n_8 = convert10_8(n_10);
	printf("十进制数%d转换成八进制数为:%ld\n", n_10, n_8);

	return 0;
}

3.十进制 >> 十六进制

cs 复制代码
int main()
{
	int n_10 = 0;
	char n_16[10];
	printf("请输入一个十进制数:");
	scanf("%d", &n_10);

	sprintf(n_16, "%X", n_10); // 将十进制数转成十六进制字符串
	printf("十进制数%d转换成十六进制数为:%s\n", n_10, n_16); // 输出十六进制数
	return 0;
}

四、十六进制

1.十六进制 >> 二进制

cs 复制代码
int main()
{
	char hex[17];  //定义一个数组
	int i = 0;

	// 读入16进制数
	printf("请输入16进制数:");
	scanf("%s", &hex);

	printf("对应的2进制数为:");
	while (hex[i]) 
	{
		switch (hex[i]) 
		{
		case '0':
			printf("0000");
			break;
		case '1':
			printf("0001");
			break;
		case '2':
			printf("0010");
			break;
		case '3':
			printf("0011");
			break;
		case '4':
			printf("0100");
			break;
		case '5':
			printf("0101");
			break;
		case '6':
			printf("0110");
			break;
		case '7':
			printf("0111");
			break;
		case '8':
			printf("1000");
			break;
		case '9':
			printf("1001");
			break;
		case 'A':
		case 'a':
			printf("1010");
			break;
		case 'B':
		case 'b':
			printf("1011");
			break;
		case 'C':
		case 'c':
			printf("1100");
			break;
		case 'D':
		case 'd':
			printf("1101");
			break;
		case 'E':
		case 'e':
			printf("1110");
			break;
		case 'F':
		case 'f':
			printf("1111");
			break;
		default:
			printf("\n错误:无效的16进制数!\n");
			return 0;
		}
		i++;
	}

	return 0;
}

2.十六进制 >> 八进制

基本思路:可以通过:16 >> 10 >> 8

cs 复制代码
int main()
{
	char n_16[10];
	int n_8 = 0;
	printf("请输入一个十六进制数:");
	scanf("%s", &n_16);

	long int n_10 = strtol(n_16, NULL, 16);   //16 >> 10

	int i = 1;
	while (n_10 != 0)  //10 >> 8
	{
		n_8 += (n_10 % 8) * i;
		n_10 /= 8;
		i *= 10;
	}
	printf("十六进制数%s转换成八进制数为:%d\n", n_16, n_8);
	return 0;
}

3.十六进制 >> 十进制

可以使用C语言中的strtol函数来将十六进制字符串转换为十进制数

基本结构:long int strtol(const char *str, char **endptr, int base);

其中,第一个参数str是需要转换的字符串;

第二个参数endptr是一个指向字符指针的指针,用于存储转换后未处理的部分;

第三个参数base是转换后的数值进制,一般使用16表示十六进制。

cs 复制代码
int main()
{
	char n_16[10];
	printf("请输入一个十六进制数:");
	scanf("%s", &n_16);
	
	long int n_10 = strtol(n_16, NULL, 16);
	printf("十六进制数%s转换成十进制数为:%d\n", n_16, n_10);
	return 0;
}
相关推荐
XH华3 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__4 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界016 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐6 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
Uu_05kkq6 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
OopspoO8 小时前
qcow2镜像大小压缩
学习·性能优化
嵌入式科普9 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A9 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒9 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin