嵌入式系统基础概念(一)二进制和十六进制

引言

进制表示和转换是嵌入式开发人员的基本功。在开发,调试过程中,大量阅读芯片手册,查看MCU寄存器,内存等都会涉及到十六进制,二进制等的快速切换,以理解各个bit位含义和内容。另外C代码中也经常用到位操作。

本文面向的读者是希望通过学习能够掌握二进制和十六进制表示,并熟练二进制,十六进制间转换。

建议学习顺序,理解十进制数值如何分解,然后花足够时间理解引例部分和 106 的两种表示的例子。概念

然后就是多练习二进制,十六进制,十进制转换。技能

需要熟练三种进制数值对照表。掌握PC自带 计算器(程序员模式)进制切换。工具

 

1. 十进制(逢十进一)数值分解

基础数学表示

...

10^{3}=10\times 10\times 10

10^{2}=10\times 10

10^{0}=1

10^{-1}=0.1

...

举例 1984,数字 1 在千位(10^{3}),数字 9 在百位(10^{2}),数字 8 在十位(10^{1}),数字 4 在个位(10^{0}),分解它为

1个1000,9个100,8个10和4个1,即:

1984=1\times 10^{3}+9\times 10^{2}+8\times 10^{1}+4\times 10^{0}

.由此看出

数值 = 所有数字和对应位乘积的和。

另外十进制

每位上的数字只可能是         {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

每个位是以10为底的基         {..., 10^{-1}10^{0}10^{1}10^{2},...}

练习1      273.15怎么表示成(数字x位)的组合?

 

2. 引例

开始二进制之前, 我希望通过一个例子让读者区分开数值表示形式两个概念。

比如我们说温度,“今天20(摄氏)度”,这里的 20 就是数值,(摄氏)度 就是摄氏温标下表示形式

如果你知道除了摄氏温度还有华氏温度,并且二者可以转换参见百度百科华氏与摄氏

华氏度 = 32°F+ 摄氏度 × 1.8

同样你可以说,“今天68华氏度”,其实说的是同样的内容。

从这个例子,我们看出同样一个内容,我们其实可以表示成不同  数值+表示形式

思考,生活还有哪些例子,同样内容不同说法?比如,身高,体重,时间。

 

3.1 二进制(逢二进一

应用上面的概念,一百零六可以表示

106=1\times 10^{2}+0\times 10^{1}+6\times 10^{0}

同样也可以表示

106=64+32+8+2

如果仔细看

64=2^{6}=2\times 2\times 2\times 2\times 2\times 2

32=2^{5}=2\times 2\times 2\times 2\times 2

8=2^{3}=2\times 2\times 2

所以

106=0\times 2^{7} + 1\times 2^{6} + 1\times 2^{5} + 0\times 2^{4} + 1\times 2^{3} + 0\times 2^{2} + 1\times 2^{1} + 0\times 2^{0}

我们发现乘号前面只有 {0, 1},如果我们像表示十进制数一样,只提取每位前面的数字

就得到(习惯表示二进制时,在右下角添加数字2以区别十进制数)

01101010{\color{Red} _{2}}

这就是二进制

每位上的数字只可能是         {0, 1}

每个位是以2为底的基         {..., 2^{-1}2^{0}2^{1}2^{2},...}

对比十进制,区别在于

位上的数字,二进制只有0和1,没有2,3,。。。,9,

位不再是 。。。千,百,十,个,十分,。。。而是,。。。,bit2,bit1,bit0等,发音比特二,比特一,比特零

注意:比特+负数在浮点数计算会用到

 

再看一遍这个例子01101010{\color{Red} _{2}}

bit7            bit6           bit5           bit4           bit3           bit2            bit1          bit0

0                1               1              0               1               0                1             0

0\times 2^{7} + 1\times 2^{6} + 1\times 2^{5} + 0\times 2^{4} + 1\times 2^{3} + 0\times 2^{2} + 1\times 2^{1} + 0\times 2^{0}=106

练习2       二进制 10101001_{{\color{Red} 2}} 换做10进制表示?

10101001_{{\color{Red} 2}} 提示 填写下面8个?处,分别是0还是1?然后按上面公式计算结果

bit7            bit6           bit5           bit4           bit3           bit2            bit1          bit0

?                ?               ?              ?              ?               ?                ?               ?

打开计算器的程序员模式,手动切换二进制,输入10101001,然后切换回十进制并对照你的计算结果。

 

理解二进制之后,你是不是也能看懂下面的笑话了。

 

 

建议理解二进制和十进制间的区别和联系以及数值和表示等概念,再继续后面学习。

 

3.2 十六进制(逢十六进一

恭喜你已经理解二进制。下面来看十六进制,就非常容易了。

每位上的数字只可能是         {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}

每个位是以16为底的基         {..., 16^{-1}16^{0}16^{1}16^{2},...}

十六进制表示以 0x or 0X 开始(这里是数字不是字母O),例如 0x12AD

0_{X}12AD = 1\times 16^{3} + 2\times 16^{2} + 10\times 16^{1} + 13\times 16^{0}= 4096+512+160+13 = 4781

下面这个对照表需要记忆,十六进制1个数字   <------>  4个二进制数字

十六进制 十进制 二进制
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
A or a 10 1010
B or b 11 1011
C or c 12 1100
D or d 13 1101
E or e 14 1110
F or f 15 1111

举例 十六进制 0x1E9B 转换成二进制

      1          E           9           B

0001     1110      1001     1011

练习3 把下图中十六进制 0x078E 3AD1 转换成二进制?引用TM4C123GH6PM data sheet

 

总结

本文从大家熟悉的十进制数值表示入手,并借助温度两种不同表示(华氏和摄氏)的例子,过渡到二进制和十六进制表示。

同时,列举实际工作中用到的场景和例子。

 

 

答案1      273.15=2\times 10^{2}+7\times 10^{1}+3\times 10^{0}+1\times 10^{-1}+5\times 10^{-2}

答案2     

 10101001{\color{Red} _{2}}=1\times 2^{7} + 0\times 2^{6} + 1\times 2^{5} + 0\times 2^{4} + 1\times 2^{3} + 0\times 2^{2} + 0\times 2^{1} + 1\times 2^{0}=128+32+8+1=169

答案3