第一章 数字逻辑基础
文章目录
一.常用数制机器转换
数制:我们都知道数字都可以表示为加权和
n
u
m
b
e
r
=
∑
i
=
0
n
−
1
w
i
x
i
number=\sum_{i=0}^{n-1}w_ix_i
number=i=0∑n−1wixi
其中的wi就是我们的权,也就是基数的整数幂次方,而基数就是我们所说的“x进制”的x。
对应的每一个权都有不同xi,这个xi就是数码,数码从右往左对应的下标就是我们所说位数。
eg:“1245D”
D代表的就是十进制,那么基数为10,‘5’的权为1,位数就是0,其实就是那个i。
二.进制转换
1.二进制与十进制之间的转换
(1)二进制->十进制
利用加权和公式表示为十进制即可。
(2)十进制->二进制
-
除余法:对于整数:从最大的二进制权相除得到每一位对应的商
-
逐乘/除法:
- 对于整数部分:依次除以2,倒取余数;
- 对于小数部分:依次乘以2,顺取整数。
2.二进制和八、十六进制之间的转换
这里的方法就跟二进制与十进制转换是一样的了,但是需要注意的是,这里有简便方法:
三.数值数据的表示
我们一般来说所看到的数据表示都是以真值的形式表示出来。
eg:+3和-5的就是真值表示,二进制真值表示为:+0011和-0101。
但是计算机可不认识什么叫做正号与负号,他们只认识0和1,那么在最高位用0、1表示正数和负数的数就是机器数。
原码就是:
符
号
位
+
尾
数
部
分
(
真
值
)
符号位+尾数部分(真值)
符号位+尾数部分(真值)
eg:真值的+0011和-0101原码为00011和10101
反码就是:
-
正数跟原码一样;
-
负数需要将符号位以外的部分——也就是尾数部分按位取反。
eg:真值的+0011和-0101的反码为00011和11010。
补码就是:
-
正数还是不变;
-
尾数部分是在反码基础上加上1。
eg:真值的+0011和-0101的补码就是00011和11011
思考一下:
-
补码的存在意义?
补码,补码,顾名思义就是补上,与原码互补,那么补起来是什么数字呢?
上面的-5的补码是11011也就是-11,两个数字的尾数部分相加为16刚好是:
$$
2^{真值的位数个数}
$$
-
那么为什么要用到补码呢?
还是回到原码来讲,其实我们发现就只有负数在原码到补码的过程中发生了变化。
对于我们上面举的两个例子:+3和-5,这两个数字如果做加法,那肯定很简单:人脑直接得出是-2,但是对于机器它不知道负数是个啥玩意,于是得用机器数来表示:
-
假如我用的是原码:
00011 + 10101 00011+10101 00011+10101
结果为:
11000 11000 11000
化为真值:-8,这明显是错误的。 -
假如我用的是反码:
00011 + 11010 00011+11010 00011+11010
结果为:
11101 11101 11101
化为真值:-0010(-2),欸,对了。 -
假如我用的是补码:
00011 + 11011 00011+11011 00011+11011
结果为:
11110 11110 11110
化为真值:-1110(-2)->减一:-1101->取反:-0010,还是对了。
也就是说,如果单单从运算结果来考虑的话,确实反码和补码可以正确计算处存在负数的情况。但是事实真的如此?我们只考虑了负数和正数相加,假如是两个负数呢?
eg:-3+(-5)=-8
原码计算:
10011 + 10101 = 11000 ( − 8 ) 10011+10101=11000(-8) 10011+10101=11000(−8)
反码计算:
11100 + 11010 = 10110 ( 11001 = − 9 ) 11100+11010=10110(11001=-9) 11100+11010=10110(11001=−9)
补码计算:
11101 + 11011 = 11000 ( 11000 : − 8 ) 11101+11011=11000(11000:-8) 11101+11011=11000(11000:−8)
原码和补码反而又对了,所以从计算正确性和方便性角度而言,我们使用补码:- 先求出两个操作数的补码
- 然后不管是符号位还是尾数部分都是进行二进制运算,
- 进一步,将得出的结果再求一次补码就得到了原码。(补码的补码肯定还是原码)
- 最后,把符号位转换为+、-就可以了。
-
-
那么对于补码的感性认知又是如何呢?
个人认为可以这样理解…其实补码的产生最终目的就是解决负数在机器中的表示。
原码的思想就是用符号位的0、1来表示,但是如果要将符号位也作为运算对象的话,可能当时科学家们也发现这样行不通,上面我们也验证了。
我们以往的话人脑的认知就是数轴上以0点为起点,正方向位移量设为正数,反方向位移量为负数。但是机器不能够这样表示,因此我们就干脆把这个“0”的起始位置分成两个点放在左右两边,一个放在0位置另外一个放在:
2 n − 1 2^n-1 2n−1
位置,n就是这个尾数部分能够表示的二进制数的位数,这就是反码的提出。但是,这样也有一个缺点:取反的作用实际上就是:
[ x ] 反 = 2 n − 1 − x [x]_反=2^n-1-x [x]反=2n−1−x
没有利用到:
2 n 2^n 2n
这个数字呀,为了充分利用并且方便理解,补码就应运而生,而且确实也更加方便理解,更为重要的是补码能够像我上面验证运算的那样满足带符号位的二进制运算。如此以来:
[ x ] 补 = 2 n − x [x]_补=2^n-x [x]补=2n−x
补码就成为了现在最适合计算机使用的机器码。同时,补码还解决了+0以及-0的问题:
-
原码里面:
-0和+0分别表示为:10000和00000;
-
补码里面:
人们规定使用-2^n代替了所谓的-0,也就是说:10000代表的不再是-0而是-128,这样一来:‘人们认为+0和-0是一样的’和‘机器使用反码和原码表示+0和-0是不一样’的这个冲突就解决了。
-
四.常用的一些编码
1.BCD码
将十进制的每一个数字符号用四位二进制数表示
2.格雷码
这个编码很玄学。。。不要记书上的,你就这样记忆:
- 相邻两个码之间只有一个码位上的数码不同,其他都相同;
- 而且是从最小的开始增大编码;
五.逻辑符号
哎,这一章就是最常见的一些逻辑符号表达以及一些电路元件符号表达,详细的看书P8-P10。
补充一个定理:冗余定理——格雷码和冗余定理后面都是比较常用的、非常重要的。
冗余定理:
A
B
+
A
′
C
+
B
C
=
A
B
+
A
′
C
AB+A'C+BC=AB+A'C
AB+A′C+BC=AB+A′C
其中的BC就是冗余项。
六. 逻辑函数的图形化简法(经常考)
画n个变量卡诺图步骤:
-
将逻辑表达式化为极小项之并;
-
根据格雷码排列方向排列好卡诺图的框架;
-
填充好极小项;
-
合并值为1的部分:
-
先看有没有无关变量,随意复制无关变量以求得最好的合并式子;
-
再看能不能合并2^n个方格;
-
再看能不能合并2^{n-1}个方格;
…
-
是冗余项。
六. 逻辑函数的图形化简法(经常考)
画n个变量卡诺图步骤:
-
将逻辑表达式化为极小项之并;
-
根据格雷码排列方向排列好卡诺图的框架;
-
填充好极小项;
-
合并值为1的部分:
-
先看有没有无关变量,随意复制无关变量以求得最好的合并式子;
-
再看能不能合并2^n个方格;
-
再看能不能合并2^{n-1}个方格;
…
-
-
得到最简式。