1 数字电路与逻辑设计基础
这是《计算机组成原理》的一门先导课程。组成原理中大量内容涉及到了数字电路的知识,这下不得不好好学(复习)了。
带符号二进制加减法
正数的三个机器码(原码、反码、补码)是一样的,只有负数才需要变换。不过,一个正数与一个负数的原码貌似是不能直接进行加减运算的。反码运算时,进位加到最低位(循环进位);补码运算就直接舍弃进位了。当然,这样运算正确的前提是不发生溢出。
关于反码、补码加减运算原理的思考
反码、补码加减为什么可以这样运算?这里对其正确性提供一些想法。
注:《计算机组成原理》有非常详尽的证明,当时写出这些想法的时候还没学组原,可以看个乐子。
对于两个二进制整数 a1 和 a2,设其二进制补码均有 n 位,分别用 A1 和 A2 表示。如果把补码看作无符号二进制数,显然有:
Ai={ai2n+aiai≥0ai<0(1.1)
其中 i=1,2,−2n−1≤ai≤2n−1−1,且由式 (1.1) 也能推得 Ai 是 ai 的补码.因此,下式是显然的:Ai≡ai(mod2n)(i=1,2)(1.2) 直接对 A1 和 A2 进行加法运算,如果产生进位则舍去(相当于减去了 2n ),如果记这样算得的和为 S。将 S 视为无符号二进制数,那么
S≡A1+A2(mod2n)(1.3)
0≤S≤2n−1(1.4)
根据同余的性质,由式 (1.2)(1.3) 可得:
S≡a1+a2(mod2n)(1.5)
而在不发生溢出的前提下,a1+a2 应仍然可以用 n 位补码表示,即有:−2n−1≤a1+a2≤2n−1−1(1.6)
综合式 (1.4) ~ (1.6) 发现,当 −2n−1≤a1+a2<0 时,应有 S=a1+a2+2n;而当 0≤a1+a2≤2n−1−1 时,应有 S=a1+a2。即 S 与 a1+a2 有以下关系成立:
S={a1+a2+2na1+a2a1+a2<0a1+a2≥0(1.7)
式 (1.7) 与式 (1.1) 在形式上完全相符,因此我们所算得的 S 就是 a1+a2 的结果的补码。反码计算的正确性也可以用同样的方法得证。
格雷码
然后说说格雷码(Gray Code)。感觉其重点在于二进制码与对应格雷码之间的相互转换。实际上只需要记住二进制码转化为格雷码(单向)的方式即可:
Gn=Bn
Gi=Bi+1⊕Bi(i<n)
某一位的格雷码,等于对位的二进制码与高位的二进制码的异或。格雷码转换为二进制码的公式可以依据异或的性质由上式反推。
关于异或的一些小性质
关于异或的一些小性质:
(1) A⊕B=C→ B⊕C=A 且 A⊕C=B。
(2)对应连续异或的式子如:A=A1⊕A2⊕…⊕An
A 可以看作是 Ai(i=1,2,…,n) 的算数和(也就是不再看作布尔变量求和)模 2。