进制转换详解(解释原理简单易懂)

news2024/11/24 23:52:08

前言:在网上看了许多篇关于不同进制之间如何转换的文章,包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来,例如十进制转二进制,可能大家都知道方法,“除以2反向取余数,直到商为0”。应用该方法的确可以解决我们遇到的进制转换问题,但是如果问我们为什么这样做呢?可能很少有人可以回答的出来。另外,二进制、八进制、十进制、十六进制之间的转换规则有一大堆,当时费很大力气记住的规则,一段时间不使用,很容易就忘记了。于是,又从头到尾看了一遍原来的文章,不断的反复这个过程,浪费了很多时间和精力。根本原因是我们不了解底层的原理,当我们了解了底层原理之后,上述进制之间的转换规则完全可以自己推导出来,根本不用死记硬背。授人以渔,不如授人以渔。解决基本的进制转换问题,可以说看本篇文章就足够了。

进制转换

  • 一、预备知识
  • 二、其他进制转为十进制
  • 三、十进制转化为其他进制
    • 1、 整数部分的转化
    • 2、小数部分的转换
  • 四、二进制和八进制、十六进制之间的转化
    • 1. 二进制转化为八进制、十六进制
    • 2. 八进制、十六进制转化为二进制

一、预备知识

希望读者可以认真阅读本部分内容,因为后文进制转换的原理会以此部分内容为基础

以十进制数“1234”为例:

数码:就是数中每一位的数字。如1、2、3、4

数位:数码在这个数中的位置,从右到左从0开始递增。例如4的数位为0、3的数位为1

基数:就是每一位的数码可以有多少个数字来表示。其实就是所谓的进制,十进制,基数为十,数码可以取的值有10个,分别是0~9。

位权:对于多数位,处在某一位上的“1”所表示的数值的大小,称为该位的位权。例如十进制数位0,位权为 10^0 = 1,数位1,位权10^1 = 10,…, 数位为n,位权为10^n 。公式为 基数的数位次幂

补充说明,如果包含小数部分,小数点后的第一个数的数位为-1,小数点后的第二个数的数位为-2,以此类堆。

二、其他进制转为十进制

我们先从最简单的情况,转换为十进制开始介绍。对于数字11,它可能是二进制,也可能是八进制,还有可能是十进制、十六进制,为了避免产生歧义,我们统一使用在不同数字后添加不同符号字母的方式来表示不同进制的数。

不同进制所使用相应对后缀如下所示:

  • B, Binary (二进制)
  • O,Octal (八进制)
  • D,Decimal (十进制)
  • H,Hexadecimal (十六进制)

使用了对应单词的首字母,另外,注意八进制使用字母O表示,不要和数字0混淆。

不同进制转换为十进制的规则

数码 * 基数^数位

上文有提及到,* 表示乘法运算。^表示幂运算,即基数的数位次方。基数的数位次方,就是该位的位权,然后数码乘以该位的位权就是该位数值实际表示的数的大小。

我们以1010.101B、68O、A6H转化十进制为例

1010B (基数:2,数位从右向左,从0开始)

1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 = 10.625D

68O (基数:8)

6 * 81 + 8 * 8 0 = 48 + 8 = 56D

A6H (基数:16)

A * 161 + 6 * 160 = 10 * 16 + 6 = 166

应该很容易理解吧,任何进制转为十进制都是依据此方法计算。例如,你可以尝试算下四进制数11,七进制数11分别表示的十进制是多少?答案在评论区。

三、十进制转化为其他进制

由于整数部分和小数部分的处理方式是不同的,因此我们将分为两部分介绍。主要以二进制为例展开讲解。

1、 整数部分的转化

十进制转化为二进制的规则为什么是除以2反向取余数,直到商为0?

如下图所示:
请添加图片描述
1除以2时不够除,商为0余数为1

我将10D和展开后的1010B二进制数同时除以2,二进制数每一位的权重都减少了1,但是最后一位(最右边的一位),其数位为0无法在减少了(假如减1,那么数位就是-1,就成为小数点后一位了,然而我们想得到余数,并不想让结果为小数),余数就是最后一位的数码。

当一个某进制的整数除以该数的基数,得到的余数就是数位为0(最低位或最后一位)的数码。

本部分内容相当重要,十进制转换为其他进制的核心,所以我要尽可能详细的说明。

为了方便理解,我们以十进制数1234为例

十进制数,基数为10

1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

两边同时除以基数10

1234 / 10 = 123 … 4

1 * 102 + 2 * 101 + 3 * 100     4 * 100

从1234的角度看4除以10不够了,所以余数4

从展开式的角度看,其他数位都可以减一,但是最后一位的数位是0,无法减一了,所以余数4 * 100 = 4,或者认为是权重为104的系数4

也就验证了上面那句话,十进制数1234除以基数10,得到的余数就是(原数1234)数位为0的数码4。

(内心OS:我个人觉得术语余数使用于展开式中,术语数位和数码适用于原数本身。)

对于123,进行递归运算就好了,十进制数123除以基数10,得到的余数就是(原数123)数位为0的数码3,同时也是(原数1234)数位为1(倒数第二位)的数码3。

回到最初的问题,十进制转化为二进制的规则为什么是除以2反向取余数,直到商为0?

现在可以解答了,

除以2是因为我们要转化为二进制数,二进制数的基数是2,

反向取余数因为每次得到的余数其实是要转换为的二进制数的
最低的数码,换句话说最先得到的余数是最低位的数码,最后得到的余数是最高位的数码,所以要反向取余数

不知道我讲明白了没有,如果有问题欢迎评论区提出来,我很希望把这部分内容讲解清楚。

2、小数部分的转换

十进制小数转化为二进制小数的规则为什么是乘以2取整,正向取整数?

如下图所示:
在这里插入图片描述
我们将0.625D和0.101B的展开式同时乘以2,二进制数的每一位权重都增加了1,原来的最高位的数位从-1变为了0,换句话说,该数码从小数部分的最高位变为了整数部分的最低位,该数码已经不属于小数部分了。效果好像是小数点向右移动了一位。

当一个某进制的小数乘以该数的基数,得到的整数部分的值(数位为0的数码)就是小数部分数位为-1(小数部分最高位)的数码。其效果等同于小数点向右边移动一位

为了方便理解,我们以十进制小数0.123为例


0.123 = 1 * 10-1 + 2 * 10 -2 + 3 * 10-3
两边同时乘以基数10
1.23 = 1 * 100 + 2 * 10 -1 + 3 * 10-2
从1.23角度看,乘以10后的整数部分,就是原来小数的最高位
从展开式角度看,所有数位都增加了1,原来小数的最高位,已经成为了整数的最低位,已经不是小数部分的数码了。 数位为0的数码就是小数部分数位为-1(小数部分的最高位的数码),此时数位为0的数码是1,所以小数数位的最高位为1
或者简单的理解方式,一个小数乘以该数的基数相当于小数点向右移动一位,那么得到的整数的最低位自然就是原来小数的最高位

让我们回到最初的问题:十进制小数转化为二进制小数的规则为什么是乘以2取整,正向按顺序取整数?

乘以2是因为2是二进制的基数,(相当于小数点向右移动一位)

正向按顺序取整是因为,乘以2得到的第一个整数是原来小数的最高位,得到的第二个整数时原来小数的第二最高位。可以想想小数点一步步向右移动,每次得到的都是新小数的最高位。

对于其他进制处理方式和二进制相同,乘以基数按顺序取整。

至此,我们学习了其他进制转化位十进制和十进制转化为其他进制的规则。这里做一个小总结:

其它进制转化为十进制

数码 * 基数^数位

十进制转化为其他进制

整数部分处理
当一个某进制的整数除以该数的基数,得到的余数就是数位为0(最低位或最后一位)的数码。

小数部分处理
当一个某进制的小数乘以该数的基数,得到的整数部分的值(数位为0的数码)就是小数部分数位为-1(小数部分最高位或第一位)的数码。

换个思路,一个某进制的小数乘以该数的基数,其效果等同于小数点向右边移动一位,得到的整数部分的最低为数码自然是原小数部分最高位的数码。

其实到这里就可以实现任意两个进制之间的转换了,思路是通过十进制这座桥梁,先把待转换进制转化为十进制,在把十进制转化为最终的目标进制。

不过,二进制和八进制、二进制和十六进制之间的转换还存在更简单的方式,因此我们下文继续来介绍。

四、二进制和八进制、十六进制之间的转化

1. 二进制转化为八进制、十六进制

我依然想用“展开式”的方式,来建立二进制和八进制以及二进制和十六进制之间的联系,

10000B = 20O = 10H

1*24 + 0 * 23 + 0 * 22 + 0 * 21 + 0 * 20
2 * 82 + 0 * 80
1 * 161 + 0 * 160

似乎无法找出它们在数学上的联系。获取是我数学水平没有达到,如果有哪位大佬可以看出来可以在评论区留言,不过我想尝试利用本文的预备知识来给出一个相对看似合理的解释。可以重新回顾下预备知识如果忘记了。

在这里插入图片描述
如图所示,一个方格表示一个二进制位,把单独一个小格看成一个整体,其能表示两种状态,换句话说,每一个位可以有两个数字来表示,所以是二进制数。

把连续的两个方格看成一个整体,其可以表示四种状态,换句话说,每一位可以有四个数字来表示,所以相当于四进制数。

把连续的三个方格看成一个整体,其可以表示8种状态,换句化说,每一个位可以有八个数字表示,所以相当于8进制。

其它略。

我们以8进制为例,

其每一个的数码包括{0, 1 , 2, 3, 4, 5, 6, 7} ,其本质就是8种连续的状态而已,我们可以使用三位二进制来表示这八种状态{000, 001, 010, 011, 100, 101, 110, 111}

10000B = 20O = 10H

在这里插入图片描述

2. 八进制、十六进制转化为二进制

和一中描述的过程相反,每一个独立的八进制数、十六进制数转化为相应的二进制数。

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

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

相关文章

黎曼猜想的验证

11 for n 1 : 100000 sum sum cos(14.134725*log(n))/(n^(-0.5)) end sum -1.1151e06

IDEA设置自动导包功能

IDEA设置自动导包功能 选择File--Settings--Edotor-General-Auto Import,勾选上下图中的选项后点击 OK 即可。导包无忧~~ Add unambiguous imports on the fly:自动导入不明确的结构 Optimize imports on the fly:自动帮我们优化导入的包

vep加密视频破解转换翻录为mp4教程

可能有很多人都没有听说过这个视频格式,这是大黄蜂云课堂播放器所独有的格式,只有通过该播放器才能够打开这个加密的视频,安全系数很高,但也极大的限制了一个视频的传播和播放。如果我们在网络上下载了vep格式的视频,可…

消息队列总结(2)- RabbitMQ Kafka RocketMQ运行架构

目录 1 RabbitMQ 1.1 工作原理 1.2 名词解释 1.3 交换机的几种类型 2 Kafka 2.1 工作原理 2.2 基本概念 3 RocketMQ 3.1 工作原理 3.2 基本概念 4 RabbitMQ & Kafka & RocketMQ的差异 5 参考文档 1 RabbitMQ 1.1 工作原理 1.【消息生产】生产者&#xff0…

TMS FNC Core Crack

TMS FNC Core Crack 跨框架核心层,用于创建丰富的可视化和非可视化组件。 特点 JSON读、写和解析功能 Base64和URL编码和解码 组件持久性 撤消/恢复管理器 数字、字母数字字符集的验证 消息、文件打开和保存对话框 轻松访问应用程序和文档文件夹 打开文件和URL 位图…

非对称加密算法关于公钥和私钥

公钥和私钥成对出现 公开的密钥叫公钥,只有自己知道的叫私钥 用公钥加密的数据只有对应的私钥可以解密 用私钥加密的数据只有对应的公钥可以解密 如果可以用公钥解密,则必然是对应的私钥加的密 如果可以用私钥解密,则必然是对应的公钥加的密 …

leetcode 17 电话号码的字母组合

题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路: 从示例上来说,输入"…

第十七章:Dual Attention Network for Scene Segmentation ——双重注意力网络用于场景分割

0.摘要 在本文中,我们通过基于自注意机制捕捉丰富的上下文依赖来解决场景分割任务。与以往通过多尺度特征融合来捕捉上下文的方法不同,我们提出了一种双重注意力网络(DANet),以自适应地将局部特征与全局依赖性相结合。…

.net6中WPF的串口通信和USB通信

之前写过串口通信,不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和…

TypeScript基础教程

ts与js区别 TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program. 语言层面:JavaScript和TypeScript都是ECMAScript(ECMA-2…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节:资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论…

<数据结构>并查集

目录 并查集概念 合并 查找集合的数量 并查集类代码实现 并查集概念 并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合 不过并查集是森林的概念,并查集的学习可以帮助我们去更…

(QGIS)在QGIS中加载星图地球数据云的数据

本文以“瓦片数据”为例进行操作示例说明,类似矢量数据、地形数据等,方法步骤一样,将URL换成对应数据的示例网址与本人的token即可。 1、星图地球数据云上注册用户 注册登录星图地球数据云网站:https://datacloud.geovisearth.c…

Python 函数(二)

Python 函数(二) 一、可变参数、不可变参数 ​ 什么是可变类型,什么又是不可变类型? 这里我们首先要了解一个东西,在计算机程序中我们定义一个变量,并对其存储一个数值。这里有两个关键概念:内…

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中,函数的分文件编写是一种让代码结构更加清晰的方法,通常可以分为以下几个步骤: 创建后缀名为 .h 的头文件,在头文件中写函数的声明,以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指,如果依靠算法,可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块,小的矩阵块可以存放在寄存器中&#xff0…