怎么由逻辑电路实现二进制的加法
首先二进制的加法可以拆解为两个步骤:加与进位。
+加法 | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
+进位 | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
加这一步骤可以由异或门来完成,进位这一步骤则可以用与门来完成。
但是由这两个逻辑门只能组成一个半加器,输入2个值,输出加和位与进位。这是不够的,除了最低位的加法不需要进位配合,其他位上的加法都要进位、加位与被加一起输入。
所以需要能有3个输入2个输出的全加器。这可以由两个半加器组成。
减法的实现
我们可以用加法器来实现减法,首先来一次简单的数学推导。
253 - 176
=> 253 -176 + 1000 - 1000
=> 253 - 176 + 999 + 1 - 1000
=> 253 + (999-176) +1 - 1000
(999 - 176) 可以称作176对9的补码,这样如果我们忽略-1000(确实可以忽略,因为假如我们这的输出位只有3位那么第四位上的1是不被输出的),那么用三的加法就可以完成一个减法运算。
(999-176) +1 则可以称作是对10的补数。
这是十进制下的推导,同样在二进制下一样成立。、
所以对一个数的减法可以加上这个数的补码(二进制就是对2求补,十进制就是对10求补)即可。
如何实现储存
有种电路有两种稳态,可记录二进位制数字信号“1”和“0,这就是触发器。
基本RS触发器又称SR锁存器,是触发器中最简单的一种,也是各种其他类型触发器的基本组成部分。两个与非门或或非门的输入端输出端进行交叉耦合或首尾相接,即可构成一个基本RS触发器。
如何实现寻址
要实现一个最基本的储存器,光光只有储存功能还不够,还要能有选择的储存与读取功能也就是要有寻址能力。
假如我们有32位二进制来寻址,那么我们能选择232个单位的数据,如果一个单位的数据是一字节,那么32位寻址端的最多能储存大约是4GB的数据。这也是为什么随着电脑的内存越来越大,我们要换成64位的CPU与系统。因为超过4GB的储存,32位是无法寻址到的。
为什么是字节与十六位进制
在早期的加法器中的位宽就是8位,现在用字节表示一组8比特数据。
一字节由于有8位,其取值范围为00000000到11111111,也可以表示0~255之间的正整数,通过补码也能表示-128~127范围内的正、负整数。虽然一个8位的二进制10110110自然并直观,但不够简洁。这是我们就可以使用十六位进制来表达。一个十六位进制的数能表达4位二进制即半字节。所以一个字节只需要2个十六位进制就行,10110110就可以拆分成1011与0110,即b6h(h表明这是一个十六位进制的数)表达。
怎么实现自动操作
首先我们要有一个振荡器,它能在不需要人工干涉的情况下自动输出0与1。其经常被称为时钟,因为通过震荡可以进行计时。一个循环(cycle)就是振荡器从某个初始状态经过一段时间又回到先前的初始状态的这一段时间,又称为一个周期。周期的倒数就是这个震荡器的频率(frequency),例如20Hz就是指振荡器每秒产生20次循环。
我们能利用振荡器实现一个计数器,能循环计数。例如一个16位的计数器能累积000h~ffffh。
储存在RAM中的代码分为2种:一种是指令,让电路执行何种操作,其往往包含要操作数据的地址。另一种是数据,要被执行的代码。
计数器是种能连续累加的电路,但RAM中储存的代码往往不是连续的,那么我们需要一种方法能重新选择开始执行代码的位置的指令,即jump,通过重置计数器便可以实现。
什么是总线
总线(Bus)是指计算机组件间规范化的交换数据(data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。从另一个角度来看,如果说主板(Mother Board)是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,传输来回不停运作的比特(bit)。这些线路在同一时间内都仅能负责传输一个比特。因此,必须同时采用多条线路才能发送更多数据,而总线可同时传输的数据数就称为宽度(width),以比特为单位,总线宽度愈大,传输性能就愈佳。总线的带宽(即单位时间内可以传输的总数据数)为:总线带宽 = 频率 x 宽度(Bytes/sec)。
PC上一般有五种总线:
- 数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要储存的数据。
- 地址总线(Address Bus):用来指定在RAM(Random Access Memory)之中储存的数据的地址。
- 控制总线(Control Bus):将微处理器控制单元(Control Unit)的信号,传送到周边设备,一般常见的为USB Bus和1394 Bus。
- 扩展总线(Expansion Bus):可连接扩展槽和电脑。
- 局部总线(Local Bus):取代更高速数据传输的扩展总线。
定点数与浮点数
首先我们来介绍下BCD码(Binary-Coded Decimal),是一种二进制的数字编码形式,用二进制编码的十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。由于2的补数不于BCD码一起使用,所以BCD码需要增加一位来表示负数。
例如-4,325,120.25可以表示为如下5个字节:
00010100 00110010 01010001 00100000 00100101
14h 32h 51h 20h 25h
在上面的例子中,小数点位置在2位小数之前。关于小数点位置的信息并没有储存在数字中,它的位置是固定的。
基于这个二进制的储存和标记方式就是定点格式(fixed-point format)。
顾名思义,浮点数就是其小数点的位置不确定。其二进制的储存方法如下:
sign是符号位,exponent是指数位(单精度8位,双精度11位),fraction是有效位(单精度23位,双精度52位)。
这是不是很像我们平时用到的科学计数法。
但这种方法会带来一个问题,就是在有效位超过一定时会有精度问题。
console.log(9007199254740992 === 9007199254740993); //true console.log(9007199254740992 === 9007199254740994); //false
是的,这相等。
因为 前两者都会被储存为 1.000...(52个零)×253
9007199254740994 则会被保存为1.000...0001×253 。
其影响精度的因素是有效位数,在双精度的条件下有效位是53位(包含了符号位),由于210~103,所以双精度下能保证15位的十进制有效数,单精度则是7位。