这章在王道书里好像没有专门讲,估计不是考纲 但觉得对后面的理解还是有帮助的 故记录学习
这是运算器当中重要的组成部分 从我的角度来看 这就像是一个封装好的 类
这个类最主要用于--计算 也就是能理解成一个计算类
那么这张图是在描述ALU他大概会做些什么事情
我的理解它就像是这个类的父类(还是个抽象父类) 它定义了这个类的抽象方法 他正在描述这个类 会做些什么事情:其实无非就是 输入了三个参数 其中两个参数是操作数 还有一个参数是指令 输出的那个就是结果罢了
那么我们来看这个类他的实例是怎么样的
这个图咋一看很复杂 其实就是一个类 它里面有非常多的构造方法 然后我们可以发现 这里面的构造方法指名道姓的使用哪个 是靠的什么? 靠的是控制单元所输出的 右边那一列S、M的东西 其实就是个参数 他不同的参数类型 指向了不同的 实现方法(M告诉ALU我要进行算术还是逻辑运算、然后S那几个就告诉ALU要进行哪一种的算术/逻辑运算)
这样 我们就能 把这个算术逻辑单元想象成一个类 右边那一列是一种参数 下面那一排a和b又是两种参数 我们会发现 输入的A0~3他的位数是跟F的位数是相等的 所以这就是他的机器字长 也就是他一次性能处理多少位的数
然后再根据箭头不难发现 输出有两种 上面的F 和左边的那一堆 也是输出
这里我们首先来确认逻辑运算 因为这是ALU实现功能的基础
这里细心的兄弟发现了 其实 这里面就是我们平时写if语句的时候的&& || 和!
其实没啥差别 毕竟连C语言都这么写了 说明他底层就是这么来实现的
电路也一样
所以这个事情就变得很简单了 &&:只要有一方是0 结果就是0 ||:只要有一方是1 结果就是1 !:就是取反嘛
来看看门电路
也没啥 无非就认得谁脑袋比较圆 谁脑袋毕竟方
其中 你们有没有发现 其实与就是乘法 因为:
你把这块的A和B带入乘法进去 算 结果是不是就是Y?包括那个或 :
或就是加法啊 你带进去一算 你就知道到底谁是谁了 所以就直接记:与是乘 或为加
再根据小学生都知道的道理 :先乘除后加减 所以与优先级大于或 就那么简单
既然是加和乘 那就自然有小学生的定理:乘法分配率 乘法结合律
其实就是小学生的数学题
与非 可以分解成 两个数先非 再与
或非 可以分解成 两数先非 再或
但是异或其实就是咱们初中最爱出的自定义运算题里面的那个了
就是看a和b同不同 a、b异则输出1 否则输出0 所以这个玩意他叫异或 就是字面意思
public int 异或(int A,int B){
if(A==B)
return 0;
return 1;
}
呐就是这么个玩意 叫异或
他其实可以拆分成异和或
电路就是根据表达式画出来的而已
然后就是同或 就是把刚才的异改成了同->同就是1 否则是0 依旧是字面意思
好了终于到加法器了
在此之前 先学习一位全加器
分解一下 二进制当中做加法的步骤
其实就只有这四个东西 AB两个是要加的数 C是进位 S是和
他们有各自的名字 本位 低位 进位 其实都是字面意思 然后i就是他们的序列 跟我们玩的算法题一个道理
进位有两种可能是会进一的 一种是AB都是1 则进1 一种是A和B其中有一个1 然后低位有一个1 也是进1
所以Ci就有这样的表达式 其实就是把两种情况的可能性加到了一起 (刚才我们说过 加其实就是或)
然后我们根据表达式可以画出电路图
那么我们就可以吧这个 一位全加器的函数签名写下来
就是这样
两个一位的数相加已经解决了 一旦有很多位 的数呢
两种方案:串行加法器和并行加法器
串行就是将他们无脑一条线串起来
串行进位的并行加法器:把n个全加器串接起来,就可进行两n位数的相加。
那么这块 就不得不提到 动态规划的思想了
我们发现 第i个数的结果由第i-1来推到 则可以得到
最后会一直到C0
像这样的递推 有兴趣的小伙伴可以看一下我之前写过的动态规划的文章 正好是这一篇文章的上一篇
那么我们发现 这样的递推 每一次都会参考先前的数
也就是说:第i位向更高位的进位Ci可根据被加数、加数的第1~位,再结合C0即可确定
这样子做的好处就是 到C4为止 几乎所有的参数都是同时产生的 所以速度就会大大提高
但是越这样分解 到后面的式子就会越复杂 所以 一般来说就是把这样的做法 实现位四个位数
那么这里的A1到A4和B1到B4就是像上面那种做法来处理的 这就是并行加法器的实现过程了