进制之间的转换——n进制转换为m进制(C/C++实现,简单易懂)

目录

🌈前言:

📁 什么是进制转换:

📁其他进制转换成十进制:

📂二进制( B ) ——> 十进制( D )

📂八进制( O ) ——> 十进制( D )

📂十六进制( H ) ——> 十进制( D )

📁十进制转换成其他进制

📁N进制转换成M进制:

📁代码展示:

📜总结:

 


🌈前言:

 102bed06058b4af39d745a810577c34e.jpeg

        不知道你平常遇到进制之间转换问题是否会头疼,博主我本人遇到进制转换问题非常头疼,不知所以云,上网上搜资料也是官话一堆,难以理解,但好在,经过我不断的努力,终于学会了,所以我写下这篇文章,希望能帮助更多像我这样的人。

        本篇文章是从零开始讲解进制,再用代码实现,如果你已经有了相关的知识储备,可以直接跳转到代码展示,本版本使用C++语言,但你并不需要担心,与C语言的不同只在于输入输出的形式(cin 写成scanf  cout写成printf即可)

24e1d0a2552d4beb9994ed7c0318c08f.gif


  • 📁 什么是进制转换:

        在日常生活中,我们处处用到进制,简单来说,进制就是计数的一种方法,比如我们数学问题,1+1这样简单的问题,他就是用10进制表示的;相信你也知道,在计算机中机器是用二进制来表示的,计算机底层就是一串串0和1组成的。

        这就涉及不同进制之间转换的问题了,如何将我们日常生活中用到的进制转换成另外一种进制呢。        


  • 📁其他进制转换成十进制:

        有人就发现了规律,按权相加法,这是一种将N进制转换成10进制的一种方法。所谓的劝就是“位权”,如果你不理解,就可以认为是位置拥有的权利,比如十进制的个位,十位,百位等等,这就是权,个位的权重是10^0(10的0次方),十位就是10^1意思类推。权重的指数是从0开始的,从右向左递增。

        按权相加,顾名思义,就是每一位×它的权重相加,得出来的数就是十进制数字。这里我们以二进制举例:

2501e97d2d23482bb17c7e9b6a92ba6d.png

  • 📂二进制( B ) ——> 十进制( D )

        上面你对权重有了了解,那我们来练练手吧。我们先从二进制开始。

1 (B) 的十进制表示为 =  1(D)

    1的权重是2^0,1 * 2^0 = 1

 

10(B)的十进制表示为 = 2(D)

    0的权重是2^0, 1的权重是2^1,结果 = 0 * 2^0 + 1 * 2^1 = 2;

 

11(B)的十进制表示为 = 3(D)

    左边第一个1的权重是2^0,右边1的权重是2^1, 结果 = 1 * 2^0 + 1 * 2^1 = 3;

        进过上面简单的计算,相信你一定会了简单的二进制转换为十进制,当然也别骄傲,后面还有小数位等着你,这一部分这篇文章就不做讲解了,如果感兴趣,可以度娘一下,或者评论区留言,我会进行答复。

 

  • 📂八进制( O ) ——> 十进制( D )

       首先,我们先来讲解一下,什么是八进制,八进制就是逢八进一,也就是说每一位最多的取值就是0~7区间内,若果等于8向进一位。

        接下来,我们来看一下八进制如何转换成十进制,有了二进制基础的你,相信一定不成问题。

7(O)转换成十进制 = 7(D)

    7的权重是8^0 , 结果 = 7 * 8^0 = 7;

 

10(O)转换成十进制 = 8(D) 

    0的权重是8^0,1的权重是8^1 , 结果 = 0 * 8^0 + 1* 8^1 = 9

 

17(O)转换成十进制 = 15 (D) 

 

  • 📂十六进制( H ) ——> 十进制( D )

        十六进制就是,逢十六进一。也就是说,每一位的取值是0~15区间内,但要注意的是,10~15不用数字表示,而是用A  B  C  D  E  F表示。当然并没有规定是用大写还是小写。

F(H)转换成十进制 = 15(D)

    F=15,结果 = 15 * 16^0 = 15;

 

1F(H)转换成十进制 = 31(D)

    结果 = 1 * 16^1 + 15 * 16^0 = 31;

        以上我们对不同进制转换成十进制有了一定的了解,接下来我们来看一下十进制如何转换成其他进制。


  • 📁十进制转换成其他进制

        这里就要介绍 “整数除以进制,直到不能相除,向上读取余数”,这里我们还是以十进制与二进制之间的转换为例,如下图。

f1a6fba7a41d44baad0cbba1825fd44b.png

        同样的道理,十进制转八进制,十六进制是一样的道理,只不过除数改为了8。


  • 📁N进制转换成M进制:

        可能有的同学一看到这里就很头痛了,我才刚刚学会十进制与其他进制的转换,其他进制之间的转换这对我太难了。其实这并不难,我们只要将N进制转换成我们所熟悉的十进制,再转换成M进制不就简单了吗。

        这里扩充一个点,作为中间的转换进制,并不一定是十进制,也可以是二进制,但为了简单,适合更多的同学,所以这里将延续上面的讲解,使用十进制作为中间进制。同样,下面的代码展示,我们也是使用十进制作为中间进制。


  • 📁代码展示:

input(输入):

 进制 n  

 进制为n的数

 进制 m

output(输出):

转换成进制为m的数

 

例如:

输入:16 

            F

           10

输出:15

        下面分批次介绍各个函数,先从主函数开始,最后展示完整代码。

//主函数
int main()
{
	int n, m, ten = 0;
	char num[100000] = { 0 };
	cin >> n;
	cin >> num;
	cin >> m;
	ten = N_To_Ten(num,n);

	char ans[100000] = { 0 };
	
	int k = Ten_To_M(num, ans,ten,m);

	//打印
	for (int i = k - 1;i >= 0;i--)
	{
		cout << ans[i];
	}
	return 0;
}

        这里我们首先定义一个足够大的字符数组num,用来存放进制为n的数,我们在封装一个函数,将这个数组中的每个数转换成十进制数。其次在封装一个函数,将字符数组转换后的十进制数转换成M进制,存放到字符数组ans中。

        ten :十进制数

        k :ans中数据个数,即转化成m进制的数据后,这个数据有几位。

//n 进制 --> 10进制
int N_To_Ten(char num[],int n)
{
	int ten = 0;
	int k = 0;	//权重
	for (int i = strlen(num) - 1;i >= 0;i--, k++)
	{
		if (num[i] >= 'A' && num[i] <= 'Z')
		{
			num[i] = num[i] - 'A' + 10;
		}
		else
		{
			num[i] = num[i] - '0';
		}
		ten = ten + num[i] * pow(n, k);
	}
	return ten;
}
//10进制 --> m进制
int Ten_To_M(char ans[],int ten,int m)
{
	int k = 0;
	while (ten != 0)
	{
		int temp = ten % m;
		ten /= m;
		if (ten >= 10 && ten <= 15)
		{
			ans[k++] = temp + 'A' - 10;
		}
		else
		{
			ans[k++] = temp + '0';
		}
	}
	return k;
}

        上面的内容最难理解可能就是 num[i] +- 'A'  +- 10了吧,这里讲解一下,这里就是+将字符'A'转换成整数,10,11等等,反之-就是将整数转换成字符A B C等等。这是针对十六进制进行的判断。

        同样的道理,+ - ‘0’也是如此。都是将字符转换成整数,整数转换成字符。例如八进制,二进制等。

 


  • 📜总结:

        以上我们便从零基础开始讲解,什么是进制,十进制如何转换成其他进制,其他进制如何转换成十进制,了解了N进制转换成M进制,就是现将N进制转换成十进制,十进制再转换成M进制。作为中间进制,不仅可以是十进制,也可以是二进制等等,你熟悉那种转换方法,觉得哪种用起来编程方便,就用那种即可。

        以上,我们边对进制之间的转换做了总结复习,如果你觉得有用,欢迎点赞收藏关注,也欢迎大家在评论区讨论交流,指出我的错误。

de36a573fb0f44b9b85867d7f1094080.gif

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

visual stdio code运行vue3

npm init vuelatest 该命令初始化vue项目 使用visual stdio code创建vue项目 ,这边是vue-project文件夹 vs code打开项目 vscode操作vue项目 vscode操作vue项目

数据分析思维导图

参考&#xff1a; https://zhuanlan.zhihu.com/p/567761684?utm_id0 1、数据分析步骤地图 2、数据分析基础知识地图 3、数据分析技术知识地图 4、数据分析业务流程 5、数据分析师能力体系 6、数据分析思路体系 7、电商数据分析核心主题 8、数据科学技能书知识地图 9、数据挖掘…

设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

Autosar DEM DTC的Debounce策略

文章目录 简介Debounce策略1、基于计数器的 Debounce 策略2、基于时间的Debounce策略 简介 故障事件防抖&#xff0c;与按键防抖&#xff08;软件需要延时确认按键不是误触发&#xff09;的作用类似&#xff0c;目的是为了防止事件误触发采取的策略。 因为DTC并不是一达到触发…

Transformer Decoder的输入

大部分引用参考了既安的https://www.zhihu.com/question/337886108/answer/893002189这篇文章&#xff0c;个人认为写的很清晰&#xff0c;此外补充了一些自己的笔记。 弄清楚Decoder的输入输出&#xff0c;关键在于图示三个箭头的位置&#xff1a; 以翻译为例&#xff1a; 输…

2023.12.16 关于 分布式系统 基本介绍

目录 单机架构 服务器负载过高问题 解决方法 分布式系统 引入更多的服务器节点 负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Modul…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…

软件测试培训三个月,想找到工作,到底应该怎么搞

功能方面&#xff1a;问的最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等概念方法&#xff09;&…

C# 使用FluentHttpClient请求WebApi

写在前面 FluentHttpClient 是一个REST API 异步调用 HTTP 客户端&#xff0c;调用过程非常便捷&#xff0c;采用流式编程&#xff0c;可以将所有请求所需的参数一次性发送&#xff0c;并直接获取序列化后的结果。 老规矩从NuGet上安装该类库&#xff1a; 这边一定要认准是 P…

python/c++ Leetcode题解——1.两数之和

目录 方法1:枚举法 思路 Code 方法2:哈希表 思路 Code 方法1:枚举法 思路 最容易想到的方法是枚举数组中的每一个数 x&#xff0c;寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时&#xff0c;需要注意到每一个位于 x 之前的元素都已…

使用GPU利用ffmpeg-在Pyhton代码中实现视频转码到MP4格式的过程记录【失败告终-原因是显示型号太老不支持】

01-安装Nvida的显卡驱动和CUDA 参考文章 https://blog.csdn.net/wenhao_ir/article/details/125253533 进行安装。 02-下载ffmpeg的可执行文件 下载ffmpeg的Windows可执行文件&#xff0c;下载页面&#xff1a; https://www.gyan.dev/ffmpeg/builds/#release-builds 我在202…

深度学习中的潜在空间

1 潜在空间定义 Latent Space 潜在空间&#xff1a;Latent &#xff0c;这个词的语义是“隐藏”的意思。“Latent Space 潜在空间”也可以理解为“隐藏的空间”。Latent Space 这一概念是十分重要的&#xff0c;它在“深度学习”领域中处于核心地位&#xff0c;即它是用来学习…

ROS机器人入门

http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统&#xff0c;其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成&#xff0c;也就是说 ROS 实际上是运 行在 Linux 上的次级…

微信小程序开发学习(基础)

学习课程&#xff1a;2023最新零基础入门微信小程序开发_哔哩哔哩_bilibili 微信开发工具下载地址&#xff1a;微信开发者工具下载地址与更新日志 | 微信开放文档 开发文档&#xff1a;微信开放文档 创建新项目 机型&#xff1a;iPhoneX 快捷键 <view>.row{$}*8 <…

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…

对偶问题笔记(1)

目录 1 从 Lagrange 函数引入对偶问题2. 强对偶性与 KKT 条件3. 对偶性的鞍点特征 1 从 Lagrange 函数引入对偶问题 考虑如下优化问题 { min ⁡ f 0 ( x ) s . t f i ( x ) ≤ 0 , i 1 , ⋯ , p , h j ( x ) 0 , j 1 , ⋯ , q , x ∈ Ω , \begin{align} \begin{cases}\min…

Pipelined-ADC设计一:序言

现在是2023年12月18日&#xff0c;准备开新帖&#xff0c;设计一个 流水线型 模数转换器&#xff08; Pipelined-ADC &#xff09;。记录帖&#xff0c;后续会放在咸鱼。同步记录&#xff0c;谨防盗用。 初定指标&#xff1a;12位50Mhz&#xff0c;采用2.5bit每级结构&#xff…

奇数魔方阵

魔方阵的生成方法为第0行中间位置为1 2开始的其余n*n-1个数&#xff0c;依次按以下规则存放 1.下一个元素存放在当前元素的上一行、下一列 2.如果上一行下一列已有元素&#xff0c;则下一个元素存放的位置为当前列的下一行 3.在找上一行、下一行或下一列的时候&#xff0c;把矩…

计算机组成原理——校验码

计算机组成原理学习笔记——校验码-CSDN博客 校验码——海明码及码距&#xff0c;码距_海明码的码距是多少-CSDN博客 1 下列关于码距与检错与纠错能力的描述中正确的是 &#xff08;ABC&#xff09; &#xff08;多选&#xff09; A. 码距为1的编码不具备任何检错能力 B. 码…
最新文章