浅谈进制的转换

本文创作灵感来自CSDN@咸鱼WCY 的

咸鱼小白学嵌入式之C语言(2.进制)

博主更完就没更了,决定书接上回(喜


进制是个啥

要理解进制,首先哈,咱得知道不同进制的含义

说到底,各个进制其实有点像在用不同姿势表示一个数,也就是一个数的不同表示方式

再详细一些,就是逢几进1

 

比如十进制,就是逢十进一

那我们数数时,就是这样的:

1  2  3  4  5  6  7  8  9

可是这时候,再数就≥10了,怎么办呢?进一就好了,变成10。也就是十位+1,个位清零。

接下来,就可以再次从个位加起,再进十位,十位到9了还要加一,就会诞生百位……以此类推

那这种思维我们依葫芦画瓢到二进制,又是怎么样呢?

二进制就是逢二进一,所以每当数≥2时,就要进位。

我们从一开始吧。

下一个,1+1≥2了,那就要进一,十位+1,个位清零,得什么?

对了,10

但是此时我们一般不读这个为“十”,一般念“一零”,因为此处的10表示的和十进制的“十”就不一样了,它其实表示十进制的“二”

这是一个很重要的概念,不要拿十进制的思想套到二进制上,因为不同进制之间极有可能是同形异义

其它进制的话这样表示也是很好理解的,要注意的是16进制。

16进制是逢16进一,那就得表示出10 11 12 13 14 15啊!

于是,就有了ABCDEF。。。

不得不说,简单粗暴我喜欢

进制写法

一般来说,我们这样表示不同进制数

二进制:()B

八进制:()O

十进制:()D

十六进制:()H

填数即可

后面的字母是对应进制的缩写,不用管

比如二进制11,就可以写作11B

 

也有更简单的方法,(数)进制数  这样写

比如二进制11写作  (11)2

(一般进制数写得小一些,在括号右下角)

 

在计算机里,常用的十六进制也可能写作数加上前缀 0x (注意是阿拉伯数字0,不是o!)

 

进制的转换

就像美元和人民币一样,总得流通吧

所以,各个进制之间也总要转换的啊

依旧以十进制为标准,易得

 

c757e9ce3e414ea289adf5fbbef77d41.jpg

这样就很好理解了

 

可是,进制转换总不能要转换就从1开始写吧,要是要求转换10086D为二进制,那不得写死了??!

所以,从本质出发,我们需要一种计算方式来转换进制

这件事嘛,还得分两段说

十进制转n进制

这个还是比较好理解,也是比较常用的,用短除法。

短除法是十进制转换经典方法,原理如下,不想看可以跳下一个标题

短除法转换进制的原理

这个短除法还是基于二进制的原理实现的

二进制是逢二进一嘛,

短除法把十进制数除以二,相当于二进制进了一位,余数就是进位后的数,以此类推,最后除的余数必定是最高位的二进制数,所以就倒序写。

说到底就是十进制数除以2,相当于二进制数进了一位

(其实我也是一知半解,不知怎么解释)

短除法

咱假设要转换的数是20D

 

浅谈进制的转换_第1张图片 

 从下往上读余数,是10100,所以20D

=10100B

毫无技术含量可言 :D

(也不知是哪个人二进制题10题只对6题)

n进制转十进制

这个是比较重要的一个方法,相比短除法也难一些

理解这个之前,要了解一个重要的知识点。

基数和位权都是啥?

先不谈n进制,先看十进制

一个数,假设是456,那么我们就可以知道这里是有4个100,5个10,6个1

这应该是幼儿园知识了哈,我们略过

那么100 10 1 有什么关系呢?

前提条件,在10进制,所以我们需要探究它和10有什么关系。

不难发现,100=10^2,10=10^1,1=10^0,由个位开始指数从0开始依次连续加一

那再带入式子,得到

456D =4×10^2 + 5×10^1 + 6×10^0

这就是大名鼎鼎的——位权展开式

此处以一个字母式为例

(ABC)n=A×n^2+B×n^1+C×n^0

A,B,C分别就是基数,也就是基本的数,任何花样都以此进行

而n的若干次方就是对应的位权,平时不这么写的时候,可以理解为百位十位个位它们的区别

 

那么再次看看其他进制吧~

举例10100B,等于什么?

对,10100B=1×2^4 + 0×2^3 + 1×2^2 + 0×2^1 + 0×2^0

也可以直接化简为10100B=1×2^4 + 1×2^2

位权展开式可以干啥?

那现在知道了位权展开式,怎么用来转换进制呢?

刚刚我们看的十进制和二进制的位权展开式,有什么特点?

可以发现在展开式中底数都是对应的进制数

这个发现就能很快推导出来,这个很大可能和进制有关系

10100B=1×2^4 + 1×2^2

简单计算出来,等于16+4=20

所以,10100B=20D

其他进制也可以这样做

简单的,可以自行理解

 

更加高级一点的转换

带小数的十进制转换n进制

这个比较麻烦一点,我们以13.625D转换二进制为例

1.拆离整数部分和小数部分

这里拆开得到13和0.625

2.转换整数部分

13的话可以看前面,得1101B

3.转换小数部分

重点来了!

怎么转换小数部分嘞

其实之前我经常直接把小数点移位,转换完再移回去,可是经常错,所以这样不对

因为转换完之后的位数又和原来可能不一样,转换完再移位很显然不对

所以要用一种方法

小数部分是0.625嘛,我们需要把它不断乘以需要转换到的进制数(此处是2),取整数部分提出来加入结果小数部分,再取小数部分继续乘,一直做到小数部分为0或者精度够了,如下

整数部分:1101B

 

0.625×2=1.25          1101.1B

0.25×2=0.5              1101.10B

0.5×2=1                   1101.101B

 

所以得出,13.625D=1101.101B

如果觉得很难,没关系,之前赛前培训也被这个整得快疯了(苦笑)主要是各种小数又是整数,乘又除的啊啊啊啊啊

 

带小数的n进制转十进制

这个其实更加简单一些,位权展开式照抄就行了啊

举例,1101.101B转换为十进制

这里需要连贯性,所以整数小数一起说吧

已知1101B=1×2^3 + 1×2^2 + 0×2^1+1×2^0=13

那么……小数部分会不会也可以改写成位权展开式呢?

当然可以!

我们继续往下,0-1=-1,所以,小数部分就是负数的次方

0.101等于 1×2^-1 + 0×2^-2 + 1×2^-3

计算一下就得0.5+0+0.125=0.625

补在整数部分13后面,得13.625

所以1101.101B=13.625D

这个比小数十进制转n进制简单点吧

hhh我个人感觉是


以上就是各个进制转换的知识了,作为无聊的木子2024年的第一篇文章,可能知识点过于简单,文笔也不尽生疏,接下来木子会继续努力,更新更优质的文章

 

2024.02.13 在手机上敲打了一上午

 

你可能感兴趣的:(学习,其他,其他)