c/c++进制转换方法汇总(含全部代码)

2023-11-05

进制转换方法汇总表
原进制 转换进制 方法1 方法2 方法3 方法4
十进制 二进制 bitset指定格式输出   除留余数法 itoa
十进制 八进制 oct/%o指定格式输出 除留余数法 itoa
十进制 十六进制 hex/%x指定格式输出 除留余数法 itoa
十进制 其他进制     除留余数法 itoa
二进制 八进制 三位一组      
二进制 十进制 按权展开     strtol
二进制 十六进制 四位一组      
八进制 二进制 一位换三   除留余数法  
八进制 十进制 按权展开   strtol
八进制 十六进制      
十六进制 二进制 一位换四   除留余数法  
十六进制 八进制      
十六进制 十进制 按权展开   strtol

基本操作函数:

Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数

功能实现函数:

ToAll() 十进制转任意进制 调用函数Itoa,自带的itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流

1.任意进制转十进制

【分析】按权展开,求和即可。例如,二进制数110,即4+2+0=6;另外,不想自己写的话,有strtol函数(百度百科)。

long int strtol(const char *nptr,char **endptr,int base);参数:字符串,非法字符指针,字符串中的进制

考虑的很详细,字符串中含有非法的字符(,.*等)时还能停止转换,并返回指针。

2.十进制转任意进制

【分析】除留余数法,逆序输出余数即可。另外,如果自己不想写的话,有itoa函数。

string itoa(int x,char *string,int jz);参数:想要转换的数,转换结果字符串,转换结果的进制

3.指定格式与流

【分析】主要是八进制、十进制和十六进制。对c来说是%o%d,%x;对c++来说是oct,dec,hex。作者感觉所谓的指定格式是输入输出流,sstream的stringstream类是字符串流,本质上应该是差不多的,就写在了一起。学的不深,没有看标准库中类的源代码,请大神指点。

4.二、八、十六之间的转换

【分析】表格里面的一位换四,三位一组之类的是指通过二进制。例如,二进制与八进制进行转换,二进制的110就是八进制的6。反过来,八进制转为二进制,只需要一位转换为三位,6换为110即可。由于也不多,大家都很熟悉,没必要用除留余数法,可以自己写个映射之类的。至于八进制与十六进制的转换,可以利用二进制或十进制作为跳板。(这个代码里面没有,读者可以尝试写一下)

5.全部代码

/*
Project: 进制转换(Radix)
Date:    2019/02/24
Author:  Frank Yu
基本操作函数:
Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
功能实现函数:
ToAll() 十进制转任意进制 调用函数Itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<list>
#include<vector>
#include<map>
#include<iterator>
#include<algorithm>
#include<bitset>
#include<sstream>
#include<iostream>
using namespace std;
#define Max 100
//进制权值
int power(int R,int turn)
{
	int ans = 1;
	while (turn--)
	{
		ans = ans*R;
	}
	return ans;
}
//**************************************基本操作函数**********************************//
//任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
long int Atoi(string &S, int R)
{
	long int ans = 0;
	for (int i=0;i < S.size();i++)//按权展开
	{
		ans += (S[i] - '0') * power(R, S.size() - i - 1);
	}
	/* 网上代码 不理解(已了解,举例,十六进制时t可能为f,那么f-'a'=5,再加10就是15了)	
	int ans=0;
	for (int i = 0;i<s.size();i++)
	{
		char t = s[i];
		if (t >= '0'&&t <= '9') ans = ans*radix + t - '0';
		else ans = ans*radix + t - 'a' + 10;
	}*/
	return ans;
}
//十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
string Itoa(int Num,int R)
{
  string remain="";
  int temp;
  do {
   temp = Num%R;//取余
   Num /= R;
   if (temp >= 10)
	   remain += temp - 10 + 'A';//任意进制为大于基数大于10的进制 例如,十六进制
   else remain += temp + '0';
  } while (Num);
  reverse(remain.begin(),remain.end());//逆序
  return remain;
}
//**************************************功能实现函数**********************************//
//菜单
void menu()
{
	cout << "************1.十进制转任意进制(除留余数)       2.任意进制转为十进制(按权展开)****" << endl;
	cout << "************3.十进制指定格式输出(二、八、十六)  4.利用流****************************" << endl;
	cout << "************5.退出" << endl;
}
void menu1()
{
	cout << "************1.十进制转二进制         2.十进制转八进制****" << endl;
	cout << "************3.十进制转十六进制       4.退出**************" << endl;
}
void menu2()
{
	cout << "************1.十进制转八进制         2.十进制转十六进制**************" << endl;
	cout << "************3.八进制转十进制         4.十六进制转十进制**************" << endl;
	cout << "************5.退出" << endl;
}
//十进制转任意进制 调用函数Itoa,自带的itoa
void ToAll()
{
	int num, R;char str[Max];
	cout << "请输入数和进制:" << endl;
	cin >> num >> R;
	cout << num << "转换为"<<R<<"进制为:" << Itoa(num,R) << endl;
	cout << "利用itoa函数:" <<itoa(num,str,R)<<endl;
}
//任意进制转十进制函数 调用Atoi函数,strtol函数
void ToDecimal(string &S)
{
	int R;
	cout << "请输入数和进制:" << endl;
	cin >>S>>R;
	cout <<S<<"转换为十进制为:"<<Atoi(S, R)<<endl;
	//利用strtol函数 long int strtol(const char *nptr,char **endptr,int base)
	//参数,字符串,非法字符指针,字符串中的进制
	char nptr[Max],*stop;
	strcpy(nptr,S.c_str());//string类型转换为char
	cout<<S << "转换为十进制为(利用strtol函数):" << strtol(nptr,&stop,R) << endl;
}
//作用:利用std的hex dec 以及 bitset,c语言的%o,%x
void ZhiDing()
{
	int num;int choice = 0;
	 cout << "请输入十进制数:" << endl;
	 cin >> num;
	while (1)
	{
		menu1();
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (4 == choice) break;
		switch (choice)
		{
		case 1:cout << num <<"转为二进制(利用bitset):"<<bitset<8>(num)<<endl;break;
		case 2: {
			      cout << num << "转为八进制(利用oct):" << oct << num << endl;
				  printf("转为八进制(利用o):%o\n",num);//8位,高位补0
		         }break;
		case 3: {
			       cout << num << "转为十六进制:" << hex << num << endl;
				   printf("转为十六进制(利用x):%x\n", num);
		        }break;
		default:printf("输入错误!!!\n");break;
		}
	}
}
//作用:利用sstream头文件将数按某进制读入流,输出流
void Stream()
{
	string s;int choice = 0;
	stringstream ss;int num;
	while (1)
	{
		menu2();
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (5 == choice) break;
		switch (choice)
		{
		case 1: {
			cout << "请输入一个数:" << endl;
			cin >> num;
			ss.clear();//清空一下,防止出错
			ss << oct << num;//十进制转为八进制读入流中
			ss >> s;//转换的八进制数放入字符串s中
			cout << num << "转为八进制(利用流):" << s << endl;
		}break;
		case 2: {
			cout << "请输入一个数:" << endl;
			cin >> num;
			ss.clear();//清空一下,防止出错
			ss << hex << num;//十进制转为十六进制读入流中
			ss >> s;//转换的十六进制数放入字符串s中
			cout << num << "转为十六进制(利用流):" << s << endl;
		}break;
		case 3: {
			cout << "请输入一个数:" << endl;
			cin >> s;
			ss.clear();//清空一下,防止出错
			ss << oct << s;//将s以八进制形式读入流中
			ss >> num;//以十进制输入到num中
			cout << s << "转为十进制(利用流):" << num << endl;
		}break;
		case 4: {
			cout << "请输入一个数:" << endl;
			cin >> s;
			ss.clear();//清空一下,防止出错
			ss << hex << s;//将s以八进制形式读入流中
			ss >> num;//以十进制输入到num中
			cout << s << "转为十进制(利用流):" << num << endl;
		}break;
		default:printf("输入错误!!!\n");break;
		}
	}
}
//主函数
int main()
{
	int choice = 0;
	string S;
	while (1)
	{
		menu();
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (5 == choice) break;
		switch (choice)
		{
		case 1:ToAll();break;
		case 2:ToDecimal(S);break;
		case 3:ZhiDing();break;
		case 4:Stream();break;
		default:printf("输入错误!!!\n");break;
		}
	}
	return 0;
}

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c/c++进制转换方法汇总(含全部代码) 的相关文章

随机推荐

  • 分类方法归结为哪几种类型

    从使用技术上来分 可以分为四种类型 基于距离的分类方法 决策树分类方法 贝叶斯分类方法和规则归纳方法 基于距离的分类方法主要有最邻近方法 决策树方法有ID3 C4 5 VFDT等 贝叶斯方法包括朴素贝叶斯方法和EM算法 规则归纳方法包括AQ
  • 比较两个list是否相等

    比较两个list是否相等 public booelan equalsList List
  • spring-cloud-alibaba 0基础环境 从0开始搭建(最详细)

    这次用到的spring组件nacos fegin gateway 完全适合生产开发 1 所用版本 1 准备 springcloud alibaba 2021 0 4 2 springboot 2 7 2 release 3 springcl
  • 明明启动了三个DataNode,hadoop集群只显示一个datanode监控呢

    在虚拟机里用jps查看到了三个DataNode进程但是在9870页面的DataNode监控下只显示一个DataNode 这是为什么 jps进程 9870的DataNode information 查阅资料 在这个hadoop目录下有一个 o
  • 各版本SQL Server 通过JDBC连接的URL

    最新JDBC驱动下载地址 JDBC driver 6 4 for SQL Server 由图中可以看出 最低仅支持JRE7和SQL Server 2008 需要其他版本请自行查找 1 SQL SERVER 2000 JDBC驱动程序 msb
  • (ECCV 2022) Dense Teacher

    DenseTeacher Dense Pseudo Label for Semi supervised Object Detection https github com Megvii BaseDetection DenseTeacher
  • vscode 禁止自动排序 C++ 头文件

    vscode 禁止自动排序 C 头文件 对 C 头文件排序大部分时间是好的 但是在少数情况下 如果头文件之间的相互依赖关系没有解决 那么对头文件排序就会出现问题 原本能够编译通过的文件 经过自动排序头文件后边的不能编译了 取消自动排序头文件
  • PE 文件结构解析

    PE 文件格式由一个线性的数据流组成 由一个DOS 头开始 接着是一个PE 文件头 这些之后是所偶的区块部 包含重分配信息 符号表信息以及字符串表数据 PE 文件结构 如下图所示 文件被划分为四大部分 包含 DOS 部分 PE 文件头 节表
  • 2018年python基础面试题总结(持续更新)

    duoniu cm 1 写一个冒泡排序 def Bubblesort list for i in range 0 len list 1 for j in range 0 len list 1 i list j gt list j 1 lis
  • 软件建模分析与设计 学习日志(2)用例图 Use Case

    1 用例图的基本概念 定义 由Actor 参与者 Use Case 用例 和其间的关系构成的用于描述系统功能的动态视图 主要作用 描述Actor与Use Case之间的关系 帮助开放人员可视化地了解系统的功能 所以用例图是需求分析中的产物
  • spring boot 配置文件

    目录 配置文件作用 配置文件的分类 配置文件格式 properties properties配置文件基本语法 读取单个的配置文件 properties 缺点 yml 特点 基本语法 yml单双引号 yml对象配置读取 yml中集合的读与写
  • LDO基础知识 - 噪声来源以及解决方案

    在一篇LDO基础知识博文中 我讨论了使用低压差稳压器 LDO 过滤因开关模式电源导致的纹波电压 然而 这不是获得净化直流电源唯一要考虑的事情 因为LDO是电子设备 它们自身也会生成一定数量的噪声 选择使用低噪声LDO和采取步骤减少内部噪声
  • webpack打包font时的路径问题

    使用Webpack打包Build时 对于 woff woff2 eot ttf otf 这些类型的font文件路径有问题 一般常见的错误路径就是 static css static css fonts 出现这样的问题 大多数就是配置上的问题
  • jupyter notebook运行没反应_配置服务器上Jupyter

    由于本人最近由于一些事情 总是不能有大块时间打代码 但是有时候一些灵感又需要写一些小品级的代码来记录一下 所以我决定采用 阿里云服务器 jupyter notebook iPad 的方案解决我的问题 原因如下 云服务器可以一直运行 让代码慢
  • dual microphone wind noise reduction

    coherence weighting use magnitude squared coherence MSC supression gain limit gain function coherence based wind noise e
  • 报错: DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80070003 ()

    参考了网上的种种建议 说一下自己是怎么解决的 测试代码 音频播放列表 QMediaPlaylist mdPlayList mdPlayList new QMediaPlaylist this 注意这里使用QUrl fromLocalFile
  • Qt中的QString和QStringList常用方法

    QString定义 QString s1 abc QString s2 hello 字符串连接 QString s s1 s2 组包 s QString a 1 b 2 c 3 arg 250 arg hello arg 22 22 qDe
  • LTspice使用笔记 week3 进行.ac仿真查看相频 幅频特性 构建震荡器

    RC电路 查看相频 幅频特性 使用 ac命令可以容易 清晰地看出相频 幅频特性 ac命令的使用需要在激励源上加入一个小的ac信号 通常为1 然后进行 ac仿真即可 ac仿真的命令可以参考博主的设置 构建正弦振荡 不加入二极管 分析 只有电路
  • 运营人常备的8个营销模型一、SWOT分析二、PEST分析三、3C

    运营人常备的8个营销模型 一 SWOT分析 二 PEST分析 三 3C战略模型 四 STP理论 五 波特五力模型 六 波士顿矩阵 七 GE矩阵 八 商业模式画布 内容如下 一 SWOT分析 1 strengths是优势 2 weakness
  • c/c++进制转换方法汇总(含全部代码)

    进制转换方法汇总表 原进制 转换进制 方法1 方法2 方法3 方法4 十进制 二进制 bitset指定格式输出 除留余数法 itoa 十进制 八进制 oct o指定格式输出 流 除留余数法 itoa 十进制 十六进制 hex x指定格式输出