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

2024-08-31 13:36

本文主要是介绍C语言 - 各个进制之间的相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、二进制

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

这篇关于C语言 - 各个进制之间的相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124047

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤