如何在mc里打造一个计算器[0] -- 基础知识&备注

上图为74181在mc里的4高实例, 与正文无关

二进制

我相信如果真的不懂二进制就不会点进来看吧...........不过还是稍微提一下吧
在计算器中, 无论是条件判断结果还是数字都是用True和False表示的, 简单来说就算大家熟知的1和0, 虽然有时候会用1表示False, 0表示True, 不过这时候稍微注意一下就好

BIN
在计算机里最常用的数字表示方法是BIN, 也就是常说的二进制, 任意一个整数q可以表达为下面形式

那么则q可以写为以下形式:

如: 十进制的32526853可以表示为二进制的1111100000101001000000101

除了BIN还有另外一种常用的整数表示方法

BCD
BCD是一种十进制的编码方法, 就是把十进制的数字逐位转化位二进制, 如:

BCD按4位分割后, 其实就是相应的十进制, BCD在数字显示等地方具有巨大的优势, 虽然也存在直接使用BCD进行计算的计算器, 但是都非常复杂, 所以外面计算部分使用BIN, 而输入和显示部分使用BCD或其他办法

位操作
常用的位操作为 非not, 或or, 与and 和 异或xor, 一般考虑位操作都是一位对一位, 一位对多位和多位对多位, 一位对一位说明如下 (来自wiki)


为了避免符号混淆, or以后就使用or表示, 而不使用+, 其他同理
mc里对上述逻辑门的实现: 绿色是输入, 红色的逻辑门, 蓝色是输出



异或门有很多实现办法, 大家可以去摸索一下, 这里给出我在4高计算器使用的异或门 *最下, 注1


多位的位操作
在多位数据的处理中经常会遇到 4位 xor 1位 等情况, 处理办法就是多位的每一位都与另一个输入进行位操作
这里使用4位作示例:
1) 1010 and 1 = 1010; 1010 and 0 = 0000
2) 1100 or 1 = 1111; 1100 or 0 = 1100
3) 0101 xor 1 = 1010; 0101 xor 0 = 0101
4) not 0110 = 1001
而遇上多位与多位的操作, 处理办法是相应的每一位进行操作, 示例:
1) 1100 or 0110 = 1110
2) 0101 and 0110 = 0100
3) 1100 xor 0101 = 1001
在多位操作中存在一个叫做 位移 的操作, 也就是整体数据向左或向右移动
左移: 右边空出来的地方用0补充; 右移: 右边移动到原数据外面的直接舍去
示例 (8位):
1) 00011011 << 2 = 01101100
2) 00011011 << 5 = 01100000 / 1101100000 (这里出现两个结果是因为一个考虑了溢出整形, 另一个没有, 在实际操作中按需求设计电路 溢出整形: 见下)
3) 00011011 >> 2 = 00000110
4) 00011011 >> 5 = 00000000

溢出整形
一般计算机是不能处理太大的数字, 按照现在来说, 常见的是64bits计算机, 单次处理的数字不能大于 2^65-1 (64个1), 也就是36893488147419103231(如果你在使用python, 那也请必须牢记这个事实), 虽然这个数字大得出乎想象, 但是在设计电路时这是必须考虑的事情
那么假如处理数字的过程用还是出现了超过64位的数据, 计算机只会把高与64位的二进制直接舍去, 而这个就叫做溢出整形
示例: 假设我们的计算机异常辣鸡, 只有4bits, 也就是说最大的数字是15 (2^5-1)
在范围内的计算: 2+3=5: 0010 + 0011 = 0101, 这是没有问题的
但是遇上 9+8 的话: 1001 + 1000 = 10001, 这时候计算器只能舍去溢出的部分得到0001
注: 现代的计算器已经有专门处理溢出的指令, 就是为了确保处理大数据不会出现上述的错误
但是如果你正在学习编程, 可以注意到c或java等语音依然会出现溢出整形的情况, 前提是不报错, 但是python会自动调用上述指令, 使得溢出部分放在下一次周期计算, 所以py虽然可以处理很多的数字, 但是相应的处理时间也是剧增的
如果你正在设计N位计算器, 那么相应的溢出整形可以表示为: X and (2^(N+1)-1)
上面4bits的例子: (1001 + 1000) and 1111 = 0001

我自己擅自约定的东西
为了可以清楚地表示输入与输出的关系, 而不被复杂的逻辑门电路图冲昏头脑, 我将会大量使用简单图画加类似python式的语言, 这里使用异或门做例子:

有时候甚至会表示为:

虽然这样并不能很好地表示出电路图, 但是可以很清楚地看到数据之间的关系, 进而根据关系设计电路
对于 if (a=1): Out=b; else: Out=c, 这种关系, 可以重新表示为: Out = (a and b) or ((not a) and c), 这样就把if语句转化为逻辑结构, 从而设计出相应的电路, 是重点, 要考的

半加器
注1:
设计异或门时需要注意一个地方, 异或门是一种叫做半加器的部件的核心结构, 半加器可以输入两个一位二进制, 输出一个两位二进制, 对应的操作是加法
把半加器所有情况列出来:
0+0=00; 0+1=01; 1+0=01; 1+1=10
观察可知, 高位的结果跟与门是一样的, 而低位的结果就是异或门的结果, 为了化简繁琐的电路, 半加器可以表示为:

直接在异或门里面与门输出的地方直接拉一根线就可以当作半加器的高位输出
所以在设计异或门时记得预留一个S的输出

有了上面的知识可以设计出大部分电路
但是为了做出计算器还是不够的, 不过一下子写太长也不太好
计算器需要使用的寄存器位移寄存器在下一篇讲述
下一篇: 简单计算器的整体结构