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

前言:在网上看了许多篇关于不同进制之间如何转换的文章,包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来,例如十进制转二进制,可能大家都知道方法,“除以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.mzph.cn/news/892.shtml

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

相关文章

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…

论文阅读—2023.7.13:遥感图像语义分割空间全局上下文信息网络(主要为unet网络以及改unet)附加个人理解与代码解析

前期看的文章大部分都是深度学习原理含量多一点,一直在纠结怎么改模型,论文看的很吃力,看一篇忘一篇,总感觉摸不到方向。想到自己是遥感专业,所以还是回归遥感影像去谈深度学习,回归问题,再想着…

5月更新,docsify综合漏洞知识库!

项目介绍 一个知识库,集成了Vulhub、Peiqi、EdgeSecurity、0sec、Wooyun等开源漏洞库,涵盖OA、CMS、开发框架、网络设备、开发语言、操作系统、Web应用、Web服务器、应用服务器等多种漏洞。 关注【Hack分享吧】公众号,回复关键字【230428】获…

spring boot security自定义认证

前言 前置阅读 spring boot security快速使用示例 spring boot security之前后端分离配置 说明 实际场景,我们一般是把用户信息保存在db中(也可能是调用三方接口),需要自定义用户信息加载或认证部分的逻辑,下面提供…

bug:file name too long文件名超出系统最大限制

各操作系统支持最长的文件和目录名称长度(Linux、Win、Mac) 今天开发需求的时候发现无法新建文件,提示file name too lang,于是翻阅和查询了一些资料,发现不同操作系统下文件名和目录名最长的长度不同。 操作系统文件名…

小程序主包超1.5MB分包处理流程优化方案

"subPackages": [// 分包1 {"root": "src, // 根目录"pages": [{"path": "views/business/index", // 页面路径"name": "business_index","aliasPath": "/business/index",&…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令,是一个解释makefile中指令的命令工具,makefile是一个文件,当前目录下的文件,两者搭配使用,完成项…

Python采集课堂视频教程, m3u8视频解密

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用: requests >>> pip install requests pycryptodome --> pip install pycryptodome re 第三方模块安装方法: win R 输…

7.14~7.15学习总结

Java的前置知识学习时间截至了,慌的一批~~。 看看自己学的,再看看要求学的,简直: 现在继续:IO流里面的Commons_IO的用法: public class Main {public static void main(String[]args) throws IOException…

【C++】多线程编程三(std::mutexstd::mutex、std::lock_guard、std::unique_lock详解)

目录 一、线程间共享数据 1.数据共享和条件竞争 2.避免恶性条件竞争 二、用互斥量来保护共享数据 1. 互斥量机制 2.mutex头文件介绍 三、C中使用互斥量mutex 1. 互斥量mutex使用 2.mutex类成员函数 ① 构造函数 ② lock() ③ unlock() ④ try_lock() 四、使用std::…

如何与ChatGPT愉快地聊天

原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

mac安装Golang开发环境及快速入门

目录 一、Mac brew 安装go环境 1.1 安装步骤 1.2 设置GOPATH 及环境变量 1.3 编写第一个go程序 二、快速入门 2.1 快速入门需求 2.2 go学习(自用) 2.2.1 go基础程序 2.2.2 变量声明 2.2.3 常量和枚举 2.2.4 函数与多种返回值 2.2.5 init函数…

18.Lucas-Kanade光流及OpenCV中的calcOpticalFlowPyrLK

文章目录 光流法介绍OpenCV中calcOpticalFlowPyrLK函数补充reference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 光流法介绍 光流描述了像素在图像中的运动,就像彗星☄划过天空中流动图像。同一个像素,随着时…

手写对象浅比较(React中pureComponent和Component区别)

PureComponent和Component的区别 PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数 //PureComponent类似自动加了这段shouldComponentUpdate(nextProps,nextState){let { props, state } this;// props/state:修改之前的属性状态// nextProps/nextState…

047、TiDB特性_TopSQL

TopSQL 之前 之前没有办法找单个TiKV Server的语句。只能查找整个集群的慢语句。 TopSQL之后 指定TiDB及TiKV实例正在执行的SQL语句CPU开销最多的Top 5 SQL每秒请求数、平均延迟等信息 TopSQL 使用 选择需要观察负载的具体TiDB Server或TiKV实例 观察Top 5 类SQL 查看某…

用IDEA写第一个Spring程序 HelloWorld

用IDEA写第一个Spring程序 HelloWorld 环境 Orcal JDK:1.8.0_341 maven:3.9.3 Spring:5.3.10 IDEA:2023.1.2 1. 安装JDK和IDEA 2. 安装maven并配置环境变量、换源 3. IDEA中maven属性配置,主要是版本和settings文件及…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试,可提供点参考!下面就包括测试代…

centos7 docker 安装sql server 2019

contos7安装sql server docker最低1.8或更高 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 装docker依赖包 #安装所需资源包 sudo yum install -…

uniapp实现微信小程序自带的分享功能

定义 share.js 文件 export default {data() {return {// 默认的全局分享内容share: {title: 标题,path: /pages/index/index, // 全局分享的路径imageUrl: , // 全局分享的图片(可本地可网络)}}},// 定义全局分享// 1.发送给朋友onShareAppMessage(res) {return {title: this…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码(C语言) 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序(by Donald Shell) 引例 给以下序列进行排序: 先以5的间隔进行插入排序&#xff1a…