跳转至

1 数字电路与逻辑设计基础

这是《计算机组成原理》的一门先导课程。组成原理中大量内容涉及到了数字电路的知识,这下不得不好好学(复习)了。


带符号二进制加减法

  正数的三个机器码(原码、反码、补码)是一样的,只有负数才需要变换。不过,一个正数与一个负数的原码貌似是不能直接进行加减运算的。反码运算时,进位加到最低位(循环进位);补码运算就直接舍弃进位了。当然,这样运算正确的前提是不发生溢出

关于反码、补码加减运算原理的思考

  反码、补码加减为什么可以这样运算?这里对其正确性提供一些想法。

注:《计算机组成原理》有非常详尽的证明,当时写出这些想法的时候还没学组原,可以看个乐子。
  对于两个二进制整数 a1 a_ 1 a2 a_ 2 ,设其二进制补码均有 n n 位,分别用 A1 A_ 1 A2 A_ 2 表示。如果把补码看作无符号二进制数,显然有: Ai={aiai02n+aiai<0(1.1)A_ i=\begin{cases} a_ i & a_ i\geq 0\\ 2^n+a_ i & a_ i < 0 \end{cases} \tag{1.1}   其中 i=1,2 i=1,2 2n1ai2n11 -2^{n-1}\leq a_ i\leq 2^{n-1}-1 ,且由式 (1.1) (1.1) 也能推得 Ai A_ i ai a_ i 的补码.因此,下式是显然的:Aiai(mod2n)(i=1,2)(1.2)A_ i\equiv a_ i\pmod{2^n}\tag{1.2}(i=1,2)  直接对 A1 A_ 1 A2 A_ 2 进行加法运算,如果产生进位则舍去(相当于减去了 2n 2^n ),如果记这样算得的和为 S S 。将 S S 视为无符号二进制数,那么 SA1+A2(mod2n)(1.3)S\equiv A_ 1+A_ 2\pmod{2^n} \tag{1.3} 0S2n1(1.4)0\leq S\leq 2^n-1\tag{1.4}   根据同余的性质,由式 (1.2)(1.3) (1.2)(1.3) 可得: Sa1+a2(mod2n)(1.5)S\equiv a_ 1+a_ 2\pmod{2^n} \tag{1.5}   而在不发生溢出的前提下,a1+a2 a_ 1+a_ 2 应仍然可以用 n n 位补码表示,即有:2n1a1+a22n11(1.6)-2^{n-1}\leq a_ 1+a_ 2\leq 2^{n-1}-1 \tag{1.6}   综合式 (1.4) (1.4) ~ (1.6) (1.6) 发现,当 2n1a1+a2<0 -2^{n-1}\leq a_ 1+a_ 2 < 0 时,应有 S=a1+a2+2n S=a_ 1+a_ 2+2^n ;而当 0a1+a22n11 0\leq a_ 1+a_ 2\leq 2^{n-1}-1 时,应有 S=a1+a2 S=a_ 1+a_ 2 。即 S S a1+a2 a_ 1+a_ 2 有以下关系成立: S={a1+a2+2na1+a2<0a1+a2a1+a20(1.7)S=\begin{cases} a_ 1+a_ 2+2^n & a_ 1+a_ 2 < 0\\ a_ 1+a_ 2 & a_ 1+a_ 2\geq 0 \end{cases} \tag{1.7}   式 (1.7) (1.7) 与式 (1.1) (1.1) 在形式上完全相符,因此我们所算得的 S S 就是 a1+a2 a_ 1+a_ 2 的结果的补码。反码计算的正确性也可以用同样的方法得证。

格雷码

  然后说说格雷码(Gray Code)。感觉其重点在于二进制码与对应格雷码之间的相互转换。实际上只需要记住二进制码转化为格雷码(单向)的方式即可: Gn=BnG_ n=B_ n

Gi=Bi+1Bi(i<n)G_ i=B_ {i+1}\oplus B_ i(i<n)   某一位的格雷码,等于对位的二进制码与高位的二进制码的异或。格雷码转换为二进制码的公式可以依据异或的性质由上式反推。

关于异或的一些小性质

关于异或的一些小性质:
(1) AB=C A\oplus B=C\rightarrow BC=A B\oplus C=A AC=B A\oplus C=B
(2)对应连续异或的式子如:A=A1A2AnA=A_ 1\oplus A_ 2\oplus …\oplus A_ n    A A 可以看作是 Ai(i=1,2,,n) A_ i(i=1,2,…,n) 的算数和(也就是不再看作布尔变量求和)模 22