175
社区成员
发帖
与我相关
我的任务
分享在学C语言也好,单片机也好,plc也好,首要就是搞明白进制问题,进制深刻地影响我们对数据的判断和辨别,本篇将分享转换为十进制的万用法则。
一、进制
在数据处理这方面,我们一般采用的进制有:
十六进制、八进制、二进制和十进制。
在嵌入式C语言中,一般普通数据采用十进制,按位操作则使用二进制,当操作字节或位数较大的数则使用十六进制
二、进制相互转换
在介绍进制转换之前,首先要知道除了十进制外,八进制和十六进制通常都由二进制转变而来。
二进制一般采用“8421”结构速记,即以四位二进制数为例,按从右向左的顺序,第一位代表2的0次方,第二位代表2的1次方,以此类推至第四位。 在面对该类二进制数时只需以每四位为一组,将为二进制为1的对应位的对应数加起来即可等到对应十进制数。
eg.1111(二进制数)=1x2^3+1x2^2+1x2^1+1x2^0=8+4+2+1=15(十进制数)=F(十六进制数)=17(八进制数)
可以发现,四位二进制最大值正好可以容纳一位十六进制数
通常来说,以一位是一个二进制数为例,每三位为一个八进制数,每四位是一个十六进制数,以下详解:
1.二进制转十六进制
以字节为例,一个字节由8位二进制数组成,所以由于每四位为一个十六进制数,则一个字节一般可以以两个十六进制数表示。
一般习惯上用“8421”转四位二进制数为十进制再转十六进制。
eg.1101 0101(二进制)=8+4+1 4+1=13 5=D5(十六进制)
2.二进制转八进制
“8421”法则依然通用,三位二进制数正好可以表示一位八进制数,使用方法雷同十六进制数,只不过只需“421”三位即可。
3.十进制转二进制
一般将该十进制数除以2,反向取余数部分,可除尽部分为0,将余数从下向上排列即可。可参考文末链接。
eg. 2 |109
2 |54............1
2|27...........0
2|13.........1
2|6.........1
2|3.......0
2|1.....1
0....1
则得到的二进制数为0110 1101(习惯上最好写为方便十六进制表示的写法)
*快捷算法:8位以内最好试着“8421”快速计算
3.十进制转八进制、十六进制
转八进制:一般将该十进制数除以8,反向取余数部分,可除尽部分为0,将余数从下向上排列即可。可参考文末链接。
转十六进制:一般将该十进制数除以16,反向取余数部分,可除尽部分为0,将余数从下向上排列即可。可参考文末链接。
三、十进制转换万用法则
对于一般人来说,十进制是最熟悉不过的进制法了,所以我们将会围绕十进制展开我们的万用公式。
首先我们要理解进制的语言含义:“进”表示进位,“制”表示制度,则进位也即是进位的制度 。
我们可以将进制分为两个部分:
1.基础字符
2.进制度数
以十进制为例,其基础字符为0-9,进制度数为10,即每十个数进一位,所以其他几种进制如下表:
| 进制 | 基础字符(代表十进制数) | 进制度数 |
| 二进制 | 0-1(0-1) | 2 |
| 八进制 | 0-7(0-7) | 8 |
| 十六进制 | 0-F(0-15)(其中0-9不变,10-15照字母表顺序对应A-F) | 16 |
其次我们要看进制规律,
以十进制为例,如下:
个位数:eg. 2=2x10^0=2x1 7=7x10^0=7x1=7
十位数:eg. 19=1x10^1+9x10^0=1x10+9x1=10+9 68=6x10^1+8x10^0=6x10+8x1=60+8
百位数:eg. 123=1x10^2+2x10^1+3x10^0=1x100+2x10+3x1=100+20+3
……
由此可以看出,十进制的数从个位数开始,每一位代表着10的不同次方,个位数代表10的0次方,十位数代表10的1次方,百位数代表10的2次方,以此类推,很容易就能得出各种不同的十进制数。而更加直观的看的话可以当成从最右向左数,最右为进制度数的0次方,第二右的为进制度数的1次方。。。
所以,其他进制的算法也是同一原理:
十六进制:eg.BF=B(可看作十进制数11)x16^1+F(可看作十进制数15)x16^0=11x16+15x1=181(十进制数)
八进制:eg. 123=1x8^2+2x8^1+3x8^0=1x64+2x8+3x1=75(十进制数)
二进制:eg.1010=1x2^3+0x2^2+1x2^1+0x2^0=1x8+0x4+1x2+0x1=8+0+2+0=10(十进制数)
进制部分也可参考该文章: