进制转换详解

进制转换的基本概念

进制转换是将一个数从一种基数(进制)转换为另一种基数的过程。例如,将十进制数转换为二进制、八进制或十六进制。

转换过程

以十进制数转换为其他进制为例,转换的基本步骤如下:

• 除以目标进制的基数:将十进制数除以目标进制的基数(例如,二进制的基数是2,八进制的基数是8,十六进制的基数是16)。

• 取余数:获取上一步除法的余数。这个余数将是转换后进制中的最低位(最右边的位)。

• 更新数值:将上一步的商再次除以目标进制的基数,重复这个过程。

• 重复直到商为0:继续这个过程,直到商为0。每次得到的余数将构成转换后的数的每一位,从最低位到最高位。

• 组合余数:将所有得到的余数从最后一个开始向前组合,形成最终的转换结果。

示例

假设我们要将十进制数13转换为二进制:

def4195f0485455c89d61f5d05da14ff.png

现在,我们将余数从下到上(从最后一个到第一个)组合起来,得到二进制数1101。

C++代码实现

string convertToBase(int x, int y) {// 初始化一个空字符串,用于存储转换后的结果string result = "";// 定义一个字符串,包含所有可能用到的数字字符,从0到9和A到Fconst string digits = "0123456789ABCDEF";// 当x大于0时,循环继续while (x > 0) {// 计算x除以y的余数,这个余数将是转换后进制的最低位int remainder = x % y;// 将余数转换为对应的字符,并加到结果字符串的前面// 这里使用digits[remainder]来获取余数对应的字符result = digits[remainder] + result;// 更新x的值为商,为下一次循环做准备x /= y;}// 如果结果字符串为空,说明原始的x为0,返回"0"if (result.empty()) {result = "0";}// 返回转换后的字符串结果return result;}

这个函数的工作原理是:

convertToBase 函数接受两个参数: x (十进制数)和 y (目标进制),并返回转换后的字符串。

1. 初始化一个空字符串 result 来存储最终的转换结果。

2. 定义一个常量字符串 digits ,它包含了所有可能用到的数字字符,从'0'到'9'和'A'到'F',用于将数字转换为对应的字符。

3. 使用 while 循环,只要 x 大于0就继续执行循环体。

4. 在循环体内,首先计算 x 除以 y 的余数,这个余数将用于构建转换后的数字。

5. 然后,使用 digits[remainder] 获取余数对应的字符,并将其添加到 result 字符串的前面。

6. 更新 x 的值为 x 除以 y 的商,为下一次循环做准备。

7. 循环结束后,如果 result 为空,说明原始的 x 为0,因此将 result 设置为"0"。

8. 最后,返回 result 字符串,它是 x 转换为 y 进制后的结果。

这段代码中,x % y计算余数,x /= y更新商,然后将余数转换为字符并添加到结果字符串的前面。这个过程重复进行,直到x变为0。最后,如果结果为空(即输入的数为0),则返回"0"。

注意

在进制转换中,使用字符'A'到'F'是为了表示超过十进制数字'9'的数值。这是因为在二进制、八进制或十六进制等系统中,数值的表示不仅仅局限于0到9这十个数字。

为什么需要'A'到'F'?

• 二进制(Binary):只使用0和1,不需要'A'到'F'。

• 八进制(Octal):使用0到7,同样不需要'A'到'F'。

• 十六进制(Hexadecimal):使用0到9和A到F。在十六进制中,'A'代表10,'B'代表11,依此类推,直到'F'代表15。

十六进制的表示

十六进制是一种基数为16的数制,这意味着每一位可以表示16个不同的值。在十六进制中:

• 0-9 直接对应十进制的0到9。

• A-F 对应十进制的10到15。

例如,十六进制数"1A3"转换为十进制的计算方式如下:

8cacde9ab7494ba3997bd077a9c7b2f4.png

将这些值相加得到:256+160+3=419。

为什么在进制转换函数中包含'A'到'F'?

在编写一个通用的进制转换函数时,我们通常希望这个函数能够处理所有可能的进制,包括十六进制。因此,我们在函数中包含一个字符串digits = "0123456789ABCDEF",这样无论转换到哪个进制(至少到16进制),我们都能从这个字符串中获取正确的字符来表示每一位的数值。

这种设计使得函数更加灵活和通用,能够适应不同的进制转换需求,而不仅仅是局限于十进制或八进制。

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

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

相关文章

构建数字影像生态群,致力推动数字经济发展

在当今数字化浪潮汹涌澎湃的时代,数字经济逐渐成为全球经济增长新的核心驱动力。国际数字影像产业园作为数字影像领域的创新高地,正以其独特的优势和不懈的努力,为推动数字经济的蓬勃发展贡献着卓越力量。 国际数字影像产业园凭借其优越的地理…

性能测试工具1:perf

1.介绍 perf是linxu下的一款性能分析工具。Linux的性能计数器是一个新的基于内核的子系统,它为所有性能分析提供了一个框架。它包括硬件级别(CPU/PMU、性能监控单元)功能和软件(软件计数器、跟踪点)功能。 通过perf,应用程序可以利用PMU…

学籍照片电子版手机拍照采集且批量自动命名的方法

学籍照片作为学生档案的重要组成部分,其电子版的采集和管理显得尤为重要,目前主要通过“全国学籍信息管理系统”进行管理。传统的拍照和命名方式不仅耗时耗力,而且容易出现错误。为了提高效率和准确性,下面介绍如何由教师自己使用…

在wsl2中安装archlinux

在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…

蓝桥杯真题1259奇怪的捐赠(python版)

解题思路:将100万转换为7进制数,数位之和就是分成的份数 num 100_0000 sum 0 while num > 0:remainder num % 7num num // 7sum remainder print(sum)代码来自题目题解 num对7进行取余,取值范围理应是[0,1,2,3,4,5,6] 但是对于题目给定的捐赠金额实际上并不…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 ,学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库,常见的内置库(random、hashlib、json、时间、os) 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Redis面试专题-持久化

前言 开始Redis面试知识的复习和资料的收集(收集和参考了网上的优质文章),本篇文章会不断更新,本系列文章主要分为两部分,一部分是该专题所涉及的相关基础知识,另一部分是面试题与思考题,大部分…

Altium Designer基础知识2:交互式差分布线

Altium Designer基础知识2:交互式差分布线 一、本文内容与前置知识点1. 本文内容2. 所用软件 二、差分式布线介绍1. 介绍2. 使用场景 三、布线流程1. 创建差分式布线对2. 布线 一、本文内容与前置知识点 1. 本文内容 Altium Designer的基础知识,差分布…

注意力机制的输入

注意力机制的输入 flyfish 注意力机制用于确定序列中每个组成部分相对于其他部分的相对重要性。 绘图源码 import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatchplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

Anaconda创建虚拟环境+CUDA、cuDNN一同安装

文章目录 前言一、CUDA的作用二、下载CUDA的步骤2.1 查看电脑NVIDIA适合的CUDA版本( 两种方法)1)打开NVIDIA控制面板,目前我的CUDA版本是12.12)使用命令行查看,使用命令:nvidia-smi。 2.2 根据p…

数学建模之熵权法

熵权法 概述 **熵权法(Entropy Weight Method,EWM)**是一种客观赋权的方法,原理:指标的变异程度越小,所包含的信息量也越小,其对应的权值应该越低(例如,如果对于所有样本而言,某项指标的值都相…

Python学习第十六天--迭代器和生成器

一、可迭代对象 六大标准数据类型:字符串,列表,元组,字典,集合,数值类型 可迭代对象:字符串,列表,元组,字典,集合。即:通过for...in…

【JavaScript】选项卡切换

选项卡切换 选项卡切换是一种常见的网页设计模式,用于在一个页面内显示和切换不同内容区域,而无需加载页面。用户可以通过点击选项卡切换显示不同的内容,而隐藏其他内容。 多选项显示:页面顶部、侧边或其他地方通常有多个选项卡…

【Spring】Spring 整合 MyBatis

在实际项目开发中,将 Spring 和 MyBatis 进行整合可以提高开发效率、简化配置、增强事务管理和可维护性,同时利用 Spring 的强大功能能提升系统的稳定性。这里从独立使用 MyBatis 开始,逐步实现与 Spring 框架的整合。 MyBatis 独立开发 现…

JavaWeb学习(1)(同步或异步请求、依赖jQuery简单实现Ajax技术)

目录 一、Web的基本流程与页面局部刷新。 (1)web开发时基本流程。 (2)页面的"全局刷新"与"局部刷新"。 二、Ajax技术。 (1)基本介绍。 (2)基本特点。 1、与服务…

win11 vs2022 python3.9环境下运行jupyterlab

jupyter官网及简介:https://jupyter.org/ Jupyter 集合“浏览器 编程 文档 绘图 多媒体 发布”众多功能与一身,适合探究式学习。 JupyterLab是最新的基于网络的笔记本、代码和数据的互动开发环境。 Jupyter Notebook是JupyterLab的上一代版本。 由…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。 这2个定时器是互相独立的,不共享任何资源。 这个2个基本定时器只能向上计数,由于没有外部IO,所以只能计时,不能对外部…

libaom 源码分析:帧间帧内预测编码

整体流程框架逻辑 帧间帧内预测模式的分区类型 不论是 RD 模式还是 nonRD 模式,libaom 中分区只应用 PARTITION_NONE、PARTITION_HORZ、PARTITION_VERT、PARTITION_SPLIT 四种类型,不像 AV1 标准中介绍的那样有十种类型(其实 libaom 源码中也实现了所有了类型,但在正式版中…

达梦归档文件名与实例对应关系

默认的,达梦归档文件名比较难以看懂,且多实例下不好区分 靠它就行 select upper(to_char((select DB_MAGIC), xxxxxxxxxx)) mag_id; 这样就对上号了。