数电学习笔记Ⅰ——数制、运算与编码
数制
多位数码的构成方式以及从低位到高位的进位规则称为数制。
二进制
从数制定义上的表达:
(
N
)
B
=
∑
i
=
−
∞
∞
K
i
∗
2
i
(N)_B = \sum_{i=-\infty}^\infty K_i *2^i
(N)B=∑i=−∞∞Ki∗2i
举个例子就是
10
=
b
3
∗
2
3
+
b
2
∗
2
2
+
b
1
∗
2
1
+
b
0
∗
2
0
=
1
∗
2
3
+
0
∗
2
2
+
1
∗
2
1
+
0
∗
2
0
10 = b_3 * 2^3 + b_2 * 2^2 + b_1 * 2^1 + b_0 * 2^0 \\ \quad\quad = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0
10=b3∗23+b2∗22+b1∗21+b0∗20=1∗23+0∗22+1∗21+0∗20
十-二进之间的转换
整数部分十转二
对于十进制的整数部分::
(
N
)
D
=
b
n
∗
2
n
+
b
n
−
1
∗
2
n
−
1
+
b
n
−
2
∗
2
n
−
2
+
.
.
.
.
.
.
.
(N)_D = b_n * 2^n + b_{n-1} * 2^{n-1} + b_{n-2} * 2^{n-2} + .......
(N)D=bn∗2n+bn−1∗2n−1+bn−2∗2n−2+.......
会发现
(
N
)
D
/
2
=
b
n
∗
2
n
−
1
+
b
n
−
1
∗
2
n
−
2
+
b
0
(N)_D / 2 = b_n * 2^{n-1}+ b_{n-1} * 2^{n-2} + b_{0}
(N)D/2=bn∗2n−1+bn−1∗2n−2+b0
于是我们使用短除法:对一个十进制数依次除二并不断提取出
b
0
,
b
1
,
b
2
.
.
.
.
.
.
b_0,b_1,b_2......
b0,b1,b2......:
小数部分十转二
对于小数部分也是同理,十进制的小数部分可以写成:
(
N
)
D
=
b
−
1
∗
2
−
1
+
b
−
2
∗
2
−
2
+
b
−
3
∗
2
−
3
+
.
.
.
.
.
.
.
(N)_D = b_{-1} * 2^{-1} + b_{-2} * 2^{-2} + b_{-3} * 2^{-3} + .......
(N)D=b−1∗2−1+b−2∗2−2+b−3∗2−3+.......
对
(
N
)
D
∗
2
(N)_D * 2
(N)D∗2,会
=
b
−
1
+
b
−
2
∗
2
−
1
+
b
−
3
∗
2
−
2
+
.
.
.
.
.
.
.
=b_{-1} + b_{-2} * 2^{-1} + b_{-3} * 2^{-2} + .......
=b−1+b−2∗2−1+b−3∗2−2+.......这样我们就可以不断地提取出
b
−
1
,
b
−
2
,
.
.
.
.
.
.
b_{-1},b_{-2},......
b−1,b−2,......,也可以把这种方法叫做短乘法:
十六进制和八进制
如果说与十进制的转换,整体的方法论和二进制完全无异,就是把系数
2
n
2^n
2n换成
8
n
o
r
1
6
n
8^n or 16^n
8nor16n就ok了。
如果要十六进制和八进制转二进制的话,就有学问了,
因为16恰好等于2^4 ,而8恰好等于2^3。
也就是对于二进制来说,每3位二进制数字恰好等价于一位八进制;每4位二进制数字恰好等价于一位十六进制。
我们就可以直接按位转换,非常方便,以八转二为例:
而且一般来说,因为 8 n o r 1 6 n 8^n or 16^n 8nor16n数字相对较大,在十进制<—>八/十六进制的时候我们往往可以选择先将数字统一转成二进制再继续转换。
二进制的算术运算
对于无符号数,算数法则与十进制没有任何区别,只是借位规则不同而已,直接算就行,不多赘述。
有符号数
有符号数需要使用原反补码来进行表示:
对于任意正数,它的原反补码相同;对于一二进制负数,原反补码的转换关系如下:
- 原码:二进制数基础上+一前缀位表示符号位(0为正数1为负数),若用8位表示数字,如:-11 = 1000 1011
- 反码:除符号位按位取反,-11就等于1111 0100
- 补码:反码+1,-11的反码就是1111 0100+1= 1111 0101
然后就能够正常四则运算了。
二进制代码
8421BCD码
由4位自然二进制数0000(0)到1111(15)16种组合的前10种组合,即0000(0)~1001(9)构成,其余6种组合无效。
格雷码(重要)
格雷码是一种无权码,它的特点是具有相邻性,每两个香菱代码之间仅有1位取值不同,这一规则甚至同样适用于0和最大数
2
n
−
1
2^n-1
2n−1之间,格雷码的这一特点使它在代码形成和传输的过程中引起的误差较小,所以通常用于ACD中去。
但是信号形成格雷码或者系统接收到格雷码之后需要将之与二进制数字之间进行转换:
二进制 to 格雷码
- 格雷码的最高位(Leftmost)与二进制码的最高位相同
- 从左到右,逐一将二进制码相邻的2位相加(舍去进位),作为格雷码的下一位
for e.g. ( 1011 ) B (1011)_B (1011)B to gray code:
所以1011的格雷码就是1110
格雷码 to 二进制
- 二进制码的最高位(Leftmost)与格雷码的最高位相同
- 将产生的每一位二进制吗,与下一位相邻的格雷码相加(舍去进位),作为二进制码的下一位。
for e.g. gray code 1101 to binary:
1011的二进制码就是1001。
ASCII码
用于通过数字表示与转换键盘上的字符,每一个键符可用一个八位二进制码表示,也可以由一个2位的16进制表示。
常用的如 大小写字母 和 阿拉伯数字0-9 的转换是我们需要主要记忆的,也比较好记,用十六进制表示:
- A − Z : ( 41 ) H − ( 5 A ) H A-Z:(41)_H - (5A)_H A−Z:(41)H−(5A)H,一般也可以直接记A是 ( 41 ) H (41)_H (41)H然后依次后延,对应十进制是 ( 65 ) D (65)_D (65)D
- a − z : ( 61 ) H − ( 7 A ) H a-z:(61)_H - (7A)_H a−z:(61)H−(7A)H,一般也可以直接记a是 ( 61 ) H (61)_H (61)H然后依次后延.对应十进制是 ( 97 ) D (97)_D (97)D
- 0 − 9 : ( 30 ) H − ( 39 ) H 0-9:(30)_H - (39)_H 0−9:(30)H−(39)H,一般记0是 ( 30 ) H (30)_H (30)H然后依次后延.对应十进制是 ( 48 ) D (48)_D (48)D