运算电路

包含数字电路的一部分内容,为部分其他内容的基础,了解即可,一般不会直接考察。

加法运算电路

最基本的加法单元是 半加器(Half Adder)。它有两个输入,一个是加数,一个是被加数,并有两个输出,一个是和,一个是进位。

half_adder_action

1-bitHalfAdderABCoutS

全加器(Full Adder)是半加器的扩展,它加上了前一位的进位作为第三个输入,并有两个输出,一个是和,一个是进位。全加器可以级联,用于多位加法。

full_adder_action

1-bitfulladderABCinCoutS

串联全加器:构成加法器

1-bitFullAdder1-bitFullAdder1-bitFullAdder1-bitFullAdderC3C2C1C0C4A3B3A2B2A1B1A0B0S3S2S1S0

为了进行多位数的加法,全加器可以串联起来形成一个串行进位加法器(ripple carry adder)。在这种安排中,每个全加器的进位输出连接到下一个全加器的进位输入。这样,一个 n 位的加法器可以通过串联 n 个全加器来实现。

减法运算电路

二进制中的减法可以通过加法来实现。减去一个数等同于加上它的补码。为了得到一个数的补码,你首先得到它的反码(每一位都取反)然后再加1。所以,一个简单的减法器可以通过使用加法器并对第二个输入(被减数)进行补码转换来构建。

乘法运算电路

二进制乘法与十进制乘法的手工计算方式类似:

       1011   (this is binary for decimal 11)
     × 1110   (this is binary for decimal 14)
     ======
       0000   (this is 1011 × 0)
      1011    (this is 1011 × 1, shifted one position to the left)
     1011     (this is 1011 × 1, shifted two positions to the left)
  + 1011      (this is 1011 × 1, shifted three positions to the left)
  =========
   10011010   (this is binary for decimal 154)

在计算机中实现乘法指令可以通过如下几种方式模拟以上过程:

1. 软件算法

如果没有专有硬件支持,可以通过一系列加法和位移操作来实现乘法。编译器将乘法运算转换为一个循环代码段,在循环代码段中通过比较、加法和移位等指令实现乘法运算。

// 如何使用加法和位移来实现两个整数的乘法(了解即可)
unsigned int multiply(unsigned int a, unsigned int b) {
    unsigned int result = 0;  // 结果初始化为0
    while (b > 0) {           // 当第二个操作数大于0时继续循环
        if (b & 1) {          // 检查b的最低位是否为1
            result += a;      // 如果是,将a加到结果上
        }
        a <<= 1;              // 将a左移一位,相当于a乘以2
        b >>= 1;              // 将b右移一位,去掉已经处理过的最低位
    }
    return result;            // 返回计算的乘积
}

2. 顺序乘法器

通过硬件的方式实现以上的软件算法,这是最基础的实现方式,类似于我们在纸上做乘法那样,一步一步进行。

3. 阵列乘法器

阵列乘法器(Array Multiplier)是一种用于执行乘法运算的硬件电路,它通过布置一系列全加器和半加器在一个二维网格或阵列中来实现,它能够并行处理多个位的乘法和累加,可以在一个或多个时钟周期内完成乘法操作。

除法运算电路

二进制除法在计算机中的实现与我们在十进制中所执行的传统长除法类似。与二进制乘法一样,我们将使用基本的二进制操作,如移位和减法。

   商(Quotient)
    0110
   =======
10 | 1101
-      10   (这是从 `110` 中减去的,因为它大于或等于 10)
   --------
        100 
    -   10   (这是从 `100` 中减去的,因为它大于或等于 10)
   --------
         10
     -   10   (这是从 `10` 中减去的,因为它大于或等于 10)
   --------
          0   (这是余数 Remainder)