进制转换(c++)

news2025/4/21 10:09:58

由于进制转换属于基础且比较重要,所以我就写一个博客方便自己复习,过程中如有错误,还请指出。

常用的进制有二进制,八进制,十进制和十六进制。

常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制

我们先来讲其他进制转换成十进制。我们先看个例子,比如有一个十进制数字是666

那我们可以分解为6*10^2 + 6*10^1 + 6*10^0 ,这个分解求和出来的结果是十进制数字的,那么同理,如果有一个二进制数字1011,想转换成十进制数字就可以变成, 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0. 得到的结果是11,那这个11就是1011转换成十进制数的结果.有了这个基础,我们就可以写一段代码来求了

先包含头文件

1.由于得到的是十进制数,所以返回值类型是int

2.由于其他进制可能原本包含字母(比如16进制就包含A,B,C,D,E,F),所以形参用string来接收,base是本来的进制数,比如16进制转换成10进制,base就是16

3.这里的做法是从高位开始取,也就是从s的下标0开始,字符串的左边是高位,右边是低位,为什么这样做呢?因为我们后面可以用动态权值累加的方法,比较方便和容易理解。

4.下面的动态权值累加是核心代码,务必要理解,这里其实可以用分配律来理解

比如有一个16进制数1AB,那么执行下来就是

ans = 0 * 16 + 1          == 1 * 16^0

ans = 1 * 16 + 10        == 1 * 16^1 + 10 * 16^0

ans = 26 * 16 + 11        == (16 + 10) * 16^1 + 11        == 1 * 16^2 + 10 * 16^1 + 11 * 16^0

可以看到,从高位开始乘,如果后面还有位数,那之前乘过的位数上的数字都会乘上一个进制数base,这样子我们就可以模拟出手算的过程了

接下来是十进制转换成其他进制,一般都是用连除法,即这个数每次都除以要转换的进制数,记录下来余数,再将得到的结果继续除,直到得到的结果为0停止,此时记录下来的余数,最开始记的是低位,也就是在最右边,最后面记的是高位,也就是最左边

1.其他进制可能有字母,所以返回值类型是string,要传入的是十进制数和要转换成的进制base

2.while里面的temp是int类型,所以转换成字符型数字要加个字符'0',ans是string类,虽然会隐式转换,但显式转换更直观一点,也可以避免潜在风险

3.最后,由于我们第一次得到的余数记录在string是最左边(高位),但是第一次得到的余数是低位的,所以我们需要逆转一下,最后返回就行

完整代码如下:

#include <iostream>
#include <string>		//用到string函数库的内容 
#include <algorithm>	//reverse()函数头文件 
using namespace std;


int charToValue(char c)
{
	if (c >= '0' && c <= '9') {
		return c - '0';
	}
	else if (c >= 'a' && c <= 'z') {
		return 10 + c - 'a';
	}
	else if (c >= 'A' && c <= 'Z') {
		return 10 + c - 'A';
	}
	cout << "Your char error" << endl;
}



int changeToDecimal(string s, int base) //s是传进来要修改的数值,base是原本的进制数 
{
	int ans = 0;
	for (int i = 0; i < s.size(); i++) {	//从高位开始取 
		int value = charToValue(s[i]);	//将字符转换成对应数字 
		if (value > base) {	 //数字超过进制数,代表这段数值是不合理的 
			cout << "Your value beyond range" << endl;
			return -1;
		}
		//从最左端(最高位)开始算起,每经过下一位,这个位置都会乘上权值(比如16进制就是16)
		//所以假设有n位,那么我们这个算法乘下来从左到右就是乘了   k^n-1,  k^n-2,  k^n-3,   .....  k^0
		ans = ans * base + value;	//动态权值累加
	}
	return ans;
}


//十进制转换为其他进制
string decimalToOther(int decimal, int base) //十进制数,要转换的进制
{
	if (decimal == 0) return "0";	//做一个特判,为0直接返回字符串 
	string ans = "";
	while (decimal != 0)	//连除法 
	{
		int temp = decimal % base;	//模拟手算的求余过程 
		//转换成字符 
		if (temp >= 0 && temp <= 9) {
			ans += (char)('0' + temp);
		}
		else if (temp > 9){
			ans += (char)(temp + 'A' - 10);
		}
		decimal /= base;	//舍掉末尾 
	}
	reverse(ans.begin(), ans.end());	//逆序函数,第一个参数是元素的首地址,第二个参数是要结束的位置的下一位 
	return ans;
}


void testjinzhi()
{
	string s;
	int base;
	//base进制转换为10进制
	cin >> s >> k;
	cout << "其他进制转换为10进制: " << changeToDecimal(s, base) << endl;
	cout << "10进制转换为其他进制: " << decimalToOther(666, base) << endl;


}

int main()
{
	testjinzhi();
	return 0;
}

讲的不是很好,有问题可以评论区交流一下,或者可以看看别人的教程,或许更容易懂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025-03-24 学习记录--C/C++-PTA 习题7-7 字符串替换

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题7-7 字符串替换 本题要求编写程序&#xff0c;将给定字符串中的大写英文字母按以下对应规则替换&#…

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手&#xff1f;3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手&#xff0c;而不是两次或四次&#xff1f;6. 三次握手中的序列号有什么作用&#xff1f;7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…

SpringBoot2集成Elasticsearch8(使用spring-boot-starter-data-elasticsearch)

写在前面 使用spring-boot-starter-data-elasticsearch集成Elasticsearch8&#xff1f; What? 官方写的不支持啊&#xff1f;让我们来看下官方给出的版本建议。 官方地址&#xff1a; https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.…

【平台优化】持续调度参数在高负载大集群中的影响

持续调度参数在高负载大集群中的影响 背景介绍2种调度通信方式对集群的影响社区相关的讨论结论 背景介绍 这几年经历了我们大数据的Yarn集群的几次扩容&#xff0c;集群从原先的800多台增加到1300多台到现在的1600多台&#xff0c;在集群规模不断增加的过程中&#xff0c;有遇…

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点.

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…

数据库基础知识点(系列一)

1&#xff0e;数据库的发展历史分哪几个阶段&#xff1f;各有什么特点&#xff1f; 答&#xff1a;数据库技术经历了人工管理阶段、文件系统阶段和数据库系统三个阶段。 1&#xff09;人工管理阶段 这个时期数据管理的特点是&#xff1a; 数据由计算或处理它的程序自行携带…

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…

vue 对接 paypal 订阅和支付

一个是支付一个是订阅&#xff0c;写的时候尝试把他们放到一个里面&#xff0c;但是会报错&#xff0c;所以分开写了 我们的页面&#xff0c;前三个为订阅最后一个是支付&#xff0c;我把他们放到一个数组里面循环展示的&#xff0c;所以我们判断的时候只要判断id是否为4&#…

基于javaweb的SpringBoot实习管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

流影---开源网络流量分析平台(一)(小白超详细)

目录 流影介绍 一、技术架构与核心技术 二、核心功能与特性 流影部署 流影介绍 一、技术架构与核心技术 模块化引擎设计 流影采用四层模块化架构&#xff1a;流量探针&#xff08;数据采集&#xff09;、网络行为分析引擎&#xff08;特征提取&#xff09;、威胁检测引擎&…

Oracle 数据库安全评估(DBSAT)简明过程

下载DBSAT 从这里下载。 实际是从MOS中下载&#xff0c;即&#xff1a;Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)。 最新版本为3.1.0 (July 2024)&#xff0c;名为dbsat.zip&#xff0c;近45MB。 $ ls -lh dbsat.zip -rw-rw-r-- 1 oracle oins…

【T2I】Divide Bind Your Attention for Improved Generative Semantic Nursing

CODE: GitHub - boschresearch/Divide-and-Bind: Official implementation of "Divide & Bind Your Attention for Improved Generative Semantic Nursing" (BMVC 2023 Oral) ABSTRACT 新兴的大规模文本到图像生成模型&#xff0c;如稳定扩散(SD)&#xff0c;已…

【2025】基于springboot+uniapp的企业培训打卡小程序设计与实现(源码、万字文档、图文修改、调试答疑)

基于 Spring Boot uniapp 的企业培训打卡小程序设计与实现 系统功能结构图如下&#xff1a; 一、课题背景 在当今快节奏的商业环境中&#xff0c;企业培训对于员工的成长和企业的发展至关重要。为了满足企业对高效培训管理和员工便捷学习的需求&#xff0c;基于 Spring Boot …

探索AI的无限可能,体验智能对话的未来,大模型 API 演示

探索AI的无限可能&#xff0c;体验智能对话的未来&#xff0c;大模型 API 演示 效果展示&#xff1a; 项目概述 这是一个基于 Vue 3 TypeScript Vite 构建的 Vista AI 演示项目&#xff0c;旨在提供一个简洁易用的界面来展示 Vista AI 大语言模型的能力。项目包含 API 演示…

26考研——图_图的存储(6)

408答疑 文章目录 二、图的存储图的存储相关概念邻接矩阵存储方式邻接矩阵的定义顶点的度计算邻接矩阵的特点邻接矩阵的局限性 应用场景邻接矩阵的幂次意义&#xff08;了解即可&#xff09; 邻接表存储方式邻接表定义邻接表结构邻接表的特点 邻接矩阵和邻接表的适用性差异十字…

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程&#xff08;第 4 章&#xff09;进行了介绍。本章主 要讨论大语言模型的模型架构选择&#xff0c;主要围绕 Transformer 模型&#xff08;第 5.1 节&#xff09;、详细 配置&#xff08;第 5.2 节&#xff09;、主流架…

《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 21&#xff1a;异步通知 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 21&#xff1a;异步通知 I/O 模型同步与异步同步异步对比同步 I/O 的缺点异步 I/O 的优点 理解异步通知 I/O 模型实现异步通知 I/O 模型WSAEventSelect 函数和通知…

Qt6相对Qt5的主要提升(AI总结)

我&#xff1a; Qt 6 相对于5 有哪些新功能&#xff1f; Qt 6 相对于 Qt 5 有诸多新功能和改进&#xff0c;以下是主要的新增特性&#xff1a; 1. 架构和核心库的重构 模块化设计&#xff1a;Qt 6 采用了更加灵活的模块化设计&#xff0c;开发者可以按需引入必要的功能模块&a…