从C语言认识单片机(1)-二进制的由来以及进制转换
为什么用二进制
我们从小开始学习数学时候就知道了九九乘法表,为什么是九呢,因为我们日常生活中采用的是10进制计数,我想大概率是因为人类有10根手指头所以就用了10进制,但是计算机没有那么精巧的设计,计算机都是由门电路构成的,门电路表示的状态只有开或者关,也就是只有0或者1,所以顺利成长的就用二进制来表示了。最近特别火的电影孤注一掷中有一个张艺兴给外界发求救信号的片段,发的信息里面就包含666,10进制的6转换为2进制就是110。
二进制的基本原理
X进制的基本原则就是逢X进1,比如在10进制中,如果到9了再加1就变成10,也就是满10进一。在二进制中,就是满2进1,那么首先我们看最小的数,十进制中的0、1、2、3、4用二进制如何表示。为了方便我们这里认为二进制的最小位是第一位,从右往左依次递增位数。
十进制 | 二进制 | 备注(最小位为第一位,从右往左依次递增) |
---|---|---|
0 | 0 | |
1 | 1 | |
2 | 10 | 第一位满2进1 |
3 | 11 | |
4 | 100 | 第一位满2进1,第二位开始是1,由于进位的关系变为2,同样满2进1 |
上述表格就是基本的二进制原理,我们可以发现一个规律,二进制的第1位代表0或者1,第二位代表0或者2,第三位代表0或者4,可以得到一个公式,2进制的第n位如果是1就表示为:
f
=
2
n
−
1
f=2^{n-1}
f=2n−1
如果是0就是0。
二进制转换为10进制
二进制转换十进制其实已经非常简单了,按照刚才说的公式直接就进行转换就可以了。每一位按照上面的公式得到一个十进制的数字,然后相加就可以了。
10转换为二进制
作为一个程序员,截至目前没有什么好的公式或者手动的方法,有兴趣的自己网上查,最好的方法就是用计算器或者转换工具。
为什么会有16进制
计算机使用二进制,实际很多情况直接用二进制进行描述是不方便的,理解和交流都费劲,用十进制描述虽然最好接受,但十进制符合了我们人的习惯,却很难与计算机结构直接关联,因为十六进制数与二进制数之间的四位对应一位的特殊关系,十六进制在有一定计算机专业知识的人来说,描述有些内容,如地址、代码等信息时,更方便更有利于结合计算机硬件结构来进行理解。所以引入十六进制作为过渡,就能较好地解决人与计算机之间的沟通问题。普通阿拉伯数字里面没有超过10的表示,那么就用还有几个数字来表示10-15,十六进制中就用英文字母a-f表示10-15。
二进制转化为16进制
刚才说了16进制与二进制的4位可以对应出一个关系,16进制转2进制就是把2进制数按照4位一转换,我们先看一个4位的二进制数。下面有一个4位的二进制数1111,先看一下这个数对应的10进制数是多少。
位数 | 值 | 计算值 |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 4 |
4 | 1 | 8 |
4位计算值的总和10进制表示就为:1+2+4+8=15,这里刚好是4位的最大值就是16进制中单个数表示的最大值,即F。所以如果要把一个2进制转换成16进制,从最低位开始按照4位转换为一个16进制的数的原则来转换。下面给出例子:
有一个数1001001,转换为16进制,这里我们还是以最低位为第一位,第一位到第四位分别是:
位数 | 值 | 计算值 |
---|---|---|
1 | 1 | 1 |
2 | 0 | 0 |
3 | 0 | 0 |
4 | 1 | 8 |
第一位到第四位转换为16进制的结果为1+8=9
第五位到第八位分别是
位数 | 值 | 计算值 |
---|---|---|
1 | 0 | 0 |
2 | 0 | 0 |
3 | 1 | 4 |
4 | 无 | 0 |
第五位到第八位转换为16进制的结果为4
最终二进制1001001转换为16进制为49。
16进制转化为二进制
如果理解了二进制转换16进制,那么16进制转二进制就不难了,把每一个16进制的数对应成4位二进制的数就可以了,直接上例子。
有一个16进制的数E54转换为二进制:
首先看第一位4,转换为二进制为0100,第二位5转换为二进制为0101,第三位E先转为为10进制为14,那么再转换为二进制为1110,所以最终结果为111001010100。
字节的由来
提到字节,先需要知道ASCII,ASCII是一种编码格式,我们在计算机中存储数据可以用二进制,但是如果需要表示字母或者符号呢,每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。所以一个ASCII字母或符号(字符)就占用一个字节,这就是字节的由来。