首页 > 其他分享 >C语言 - 各个进制之间的相互转换

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

时间:2024-08-31 10:55:23浏览次数:11  
标签:10 转换 进制 16 int C语言 二进制 printf 八进制

目录

一、二进制

1.二进制   >>  八进制

2.二进制   >>  十进制

3. 二进制  >>  十六进制

二、八进制

1.八进制   >>  二进制

2.八进制   >>  十进制

3.八进制   >>  十六进制

三、十进制

1.十进制   >>  二进制

2.十进制   >>  八进制

3.十进制   >>  十六进制

四、十六进制

1.十六进制   >>  二进制

2.十六进制   >>  八进制

3.十六进制   >>  十进制

一、二进制

1.二进制   >>  八进制

方法一:可以通过先将二进制转换为十进制,然后再将十进制转换为八进制的方式来间接实现
方法二:直接按每三位一组处理二进制数,并直接转换为对应的八进制数

下面为方法一的代码:

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.二进制   >>  十进制

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的倍数

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;
}

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

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.八进制   >>  二进制

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

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进制)。

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()函数。

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.十进制   >>  二进制

/两个参数:一个十进制数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.十进制   >>  八进制

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.十进制   >>  十六进制

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.十六进制   >>  二进制

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

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表示十六进制。

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;
}

标签:10,转换,进制,16,int,C语言,二进制,printf,八进制
From: https://blog.csdn.net/hihahahahah/article/details/141749115

相关文章

  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......
  • C语言基础(二十八)
    1、冒泡排序: #include"date.h"#include<stdio.h>#include<stdlib.h>#include<time.h>//函数声明voidbubbleSort(int*arr,intn);int*createRandomArray(intn,int*size);intmain(){inttime=getTime();......
  • C语言基础(二十九)
    1、快速排序:#include"date.h"#include<stdio.h>#include<stdlib.h>#include<time.h>//函数声明voidquickSort(int*arr,intlow,inthigh);voidswap(int*xp,int*yp);voidprintArray(int*arr,intsize);intpar......
  • 卡尔曼滤波算法(c语言代码)
    卡尔曼滤波器是一种用于估计动态系统状态的算法,常用于信号处理、控制系统、机器人和导航等领域。以下是一个简单的卡尔曼滤波器的C语言实现示例。这个示例展示了如何使用卡尔曼滤波器来估计一维系统的状态。1.卡尔曼滤波器算法概述卡尔曼滤波器由两部分组成:预测和更新。基......
  • 数据类型转换
    一、强制类型转换也称为显式转换1、转换为number​三种方式:1.使用Number()如果内容可以转换成数字,则返回对应的数字(整数或小数)如果内容不可以转换成数字,则返回NaN如果内容为空字符串或null,则返回0如果内容为boolean,则true返回1,false返回0(boolean值在内存中就是以数......
  • C语言文件相关函数
    目录一、引言二、文件函数概述  1.文件类型指针  2.常用文件函数三、文件函数使用详解  1.打开文件  2.关闭文件  3.写入文件  4.读取文件  5.二进制文件操作四、实战应用五、总结        本文将详细介绍C语言中文件函数的基本概念......
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
    ......
  • C语言基础(二十六)
    二叉树节点通常包含三个部分:存储数据的部分、指向左子节点的指针、以及指向右子节点的指针。测试代码:#include"date.h"#include<stdio.h>#include<stdlib.h>#include<time.h>//定义二叉树节点的结构,包括节点的值、指向左子节点的指针和指向右子节点的指针。t......
  • C语言基础(二十七)
    1、位字段(Bit-fields)也是一种数据结构,允许在结构体(struct)或联合体(union)中定义其成员占用特定的位数。对于需要精确控制内存布局或处理硬件寄存器映射等场景非常有用。位字段使得开发者能够定义小于一个字节的变量,从而更有效地利用内存空间。位字段的声明方式是在结构体或联合体......
  • 11.2 C语言文件的读写操作
    11.2C语言文件的读写操作11.2文件的读写操作11.2文件的读写操作文件的读写是文件处理中的核心操作,C语言提供了多种函数来实现从文件读取数据和向文件写入数据。文件的写操作写字符:fputc(c,fp);//将字符c写入文件写字符串:fputs(str,fp);//将字符......