本文创作灵感来自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!)
进制的转换
就像美元和人民币一样,总得流通吧
所以,各个进制之间也总要转换的啊
依旧以十进制为标准,易得
这样就很好理解了
可是,进制转换总不能要转换就从1开始写吧,要是要求转换10086D为二进制,那不得写死了??!
所以,从本质出发,我们需要一种计算方式来转换进制
这件事嘛,还得分两段说
十进制转n进制
这个还是比较好理解,也是比较常用的,用短除法。
短除法是十进制转换经典方法,原理如下,不想看可以跳下一个标题
短除法转换进制的原理
这个短除法还是基于二进制的原理实现的
二进制是逢二进一嘛,
短除法把十进制数除以二,相当于二进制进了一位,余数就是进位后的数,以此类推,最后除的余数必定是最高位的二进制数,所以就倒序写。
说到底就是十进制数除以2,相当于二进制数进了一位
(其实我也是一知半解,不知怎么解释)
短除法
咱假设要转换的数是20D
从下往上读余数,是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 在手机上敲打了一上午