1. 为什么运算器习题总让人卡壳
1.1 运算器到底在算什么
计算机组成原理里,运算器这一章是很多人从“背概念”转向“真理解”的分水岭。前面讲总线、存储器,多少还能靠画图记忆;到了运算器,突然冒出一堆补码、移码、Booth算法、恢复余数法、不恢复余数法,还有各种溢出判断,光看名字就头大。我带过几轮复习,发现大家卡壳的地方高度集中:不是不会算,而是不知道为什么这么算。
先把运算器的定位说清楚。运算器是CPU里真正干“脏活累活”的部件,它负责算术运算(加减乘除)和逻辑运算(与或非、移位)。但计算机只会做加法,减法、乘法、除法全都要转化成加法来实现。这个转化过程,就是运算方法这一章的核心。习题之所以难,是因为它把“数制表示”“编码规则”“硬件实现”三件事揉在一起考,任何一环没打通,题目就做不下去。
我个人的经验是,做运算器习题之前,先把下面这张表在脑子里过一遍,比直接刷题效率高得多:
| 概念 | 一句话理解 | 常见考法 |
|---|---|---|
| 原码 | 符号位加绝对值,最直观 | 表示范围、0的表示 |
| 反码 | 负数按位取反,过渡用 | 求补码的中间步骤 |
| 补码 | 负数取反加一,加减统一 | 加减运算、溢出判断 |
| 移码 | 补码符号位取反,比大小用 | 浮点数阶码 |
| 溢出 | 结果超出表示范围 | 双符号位、单符号位判断 |
这张表看着简单,但真正做题时,很多人会在“补码的补码是原码”这种地方绕晕。原因是没有把编码当成一个映射关系来看,而是死记规则。我的建议是:拿一张纸,把-8到+7的四位二进制原码、反码、补码、移码全列出来,列一遍胜过看十遍。
1.2 习题背后的三类核心能力
运算器习题表面上千变万化,实际上就在考三种能力。第一种是编码转换能力,给你一个十进制数,你能不能快速写出它的补码、移码,能不能判断它是否溢出。第二种是算法执行能力,给你两个数,让你用Booth算法算乘法,用不恢复余数法算除法,你能不能把每一步的中间状态写对。第三种是硬件映射能力,给你一个加法器结构,问你进位怎么传、溢出怎么判、延迟怎么算。
这三种能力对应三种不同的复习方法。编码转换靠列表对比,算法执行靠手推流程,硬件映射靠画图理解。很多人复习时只做第一类,因为简单;第二类嫌麻烦,第三类直接放弃。结果考试时编码题全对,算法题写一半,硬件题空着,分数自然上不去。
我见过一个比较典型的例子。某同学做补码加法溢出判断,题目是“两个正数相加,结果符号位为1,是否溢出”。他直接答“溢出”,因为正加正得负。这个判断本身没错,但如果题目换成“两个负数相加,结果符号位为0”,他就犹豫了。问题在于他没有理解溢出的本质:溢出是结果的数值部分超出了表示范围,而不是符号位变了。符号位变化只是溢出的一个表现,不是原因。
所以做运算器习题,第一步永远是明确数据的表示范围和运算规则,第二步才是套算法。这个顺序不能反。
2. 补码运算与溢出判断的实战拆解
2.1 补码加减法的手推流程
补码加减法是运算器习题里出现频率最高的题型,没有之一。它的核心规则只有一条:减法转加法,符号位一起参与运算。具体来说,[X-Y]补 = [X]补 + [-Y]补,其中[-Y]补等于[Y]补连同符号位在内全部取反加一。
我拿一道典型题来演示。设机器字长8位,X = +1011,Y = -0101,求[X-Y]补,并判断是否溢出。
第一步,写出X和Y的补码。X是正数,补码等于原码,即00001011。Y是负数,原码是10000101,反码是11111010,补码是11111011。
第二步,求[-Y]补。Y的补码是11111011,全部取反得00000100,加一得00000101。这里要注意,取反是连同符号位一起取反,不是只取数值位。
第三步,做加法。00001011 + 00000101 = 00010000。符号位是0,结果为正,数值部分是00010000,即+16。X-Y = 11 - (-5) = 16,结果正确。
第四步,判断溢出。这里用双符号位法最稳。把X和Y的补码扩展成双符号位:X是0000001011,[-Y]补是0000000101。相加得0000010000,双符号位是00,没有溢出。
注意:双符号位法里,结果的双符号位为00表示正数无溢出,11表示负数无溢出,01表示正溢出,10表示负溢出。这个规则要背熟,比单符号位法可靠得多。
单符号位法的判断规则是:最高位进位和次高位进位不同则溢出。还是上面这道题,最高位进位是0,次高位进位是0,相同,无溢出。如果两个进位不同,就溢出了。这个方法快,但容易在手工计算时数错进位,所以我一般建议考试时用双符号位法,虽然多写一位,但不容易错。
2.2 溢出判断的三种方法对比
溢出判断是运算器习题的必考点,常见的方法有三种:单符号位法、双符号位法、变形补码法。其实双符号位法和变形补码法是一回事,只是叫法不同。我把三种方法整理成表,方便对比:
| 方法 | 判断依据 | 优点 | 缺点 |
|---|---|---|---|
| 单符号位法 | 最高位进位与次高位进位不同 | 计算快 | 手工易错 |
| 双符号位法 | 结果双符号位为01或10 | 直观可靠 | 需扩展一位 |
| 数据范围法 | 结果超出表示范围 | 概念清晰 | 需额外计算 |
数据范围法适合做选择题。比如8位补码表示范围是-128到+127,如果两个数相加的结果不在这个范围内,就溢出。这个方法不用算进位,但需要你快速判断结果范围。我一般用它来验算,不作为主要方法。
实际做题时,我推荐双符号位法为主,数据范围法验算。双符号位法写起来多一位,但每一步都看得见,不容易出错。数据范围法用来快速检查,如果两种方法结论一致,基本可以确定答案正确。
还有一个容易踩的坑:溢出和进位是两回事。进位是最高位向更高位的进位,溢出是结果超出表示范围。有进位不一定溢出,没进位也可能溢出。比如两个负数相加,最高位有进位,但结果可能没溢出;两个正数相加,最高位没进位,但结果可能溢出。这个区别一定要分清。
2.3 移位运算的细节陷阱
移位运算看起来简单,但细节特别多。算术移位、逻辑移位、循环移位,每种移位的规则不同,左移右移的效果也不同。我见过太多人在“补码右移时符号位补什么”这个问题上翻车。
先明确规则。逻辑移位不分符号位,左移右移都补0。算术移位要保留符号位,左移时符号位不变,右移时符号位也不变,数值位补什么取决于编码方式。循环移位是把移出的位补到另一端,分带进位和不带进位两种。
补码算术右移的规则是:符号位不变,数值位右移,左边补符号位。比如补码1010(-6)右移一位,符号位1不变,数值位010右移变成001,左边补1,结果是1101(-3)。验证一下,-6除以2等于-3,正确。
补码算术左移的规则是:符号位不变,数值位左移,右边补0。但左移可能导致溢出,因为数值变大了。比如补码0100(+4)左移一位,符号位0不变,数值位100左移变成000,右边补0,结果是0000(0),这显然不对,因为4乘以2应该等于8,而8位补码能表示8,但4位补码表示不了8,溢出了。
提示:做移位运算题时,先确认字长,再确认编码,最后确认移位类型。三步确认完再动笔,能避免80%的错误。
循环移位的考法通常是“带进位循环左移”或“带进位循环右移”。带进位循环左移是把进位标志位和寄存器一起左移,最高位移入进位标志,进位标志移入最低位。这个在浮点数运算和CRC校验里会用到,习题里一般考基本规则,不会太复杂。
3. 乘除法算法的逐步推演
3.1 原码一位乘法的操作细节
乘法算法是运算器习题的第二个重灾区。原码一位乘法、补码一位乘法(Booth算法)、原码两位乘法、补码两位乘法,光名字就够吓人的。但拆开看,核心逻辑都是移位加。
原码一位乘法的规则最直观:符号位单独处理,数值位做无符号乘法。具体操作是:乘数最低位为1,就加被乘数;为0,就不加。然后部分积右移一位,乘数右移一位,重复n次(n是数值位位数)。
我拿一道题演示。设X = 0.1101,Y = 0.1011,用原码一位乘法求X×Y。
符号位:0异或0等于0,结果为正。数值位:1101乘以1011。
初始化部分积为0000,乘数为1011,被乘数为1101。
第一步,乘数最低位是1,部分积加被乘数:0000 + 1101 = 1101。部分积右移一位:0110,乘数右移一位:1101(最高位补0)。这里要注意,部分积和乘数要一起右移,部分积的最低位移到乘数的最高位。
第二步,乘数最低位是1,部分积加被乘数:0110 + 1101 = 10011。部分积右移一位:1001,乘数右移一位:1110。
第三步,乘数最低位是0,不加。部分积右移一位:0100,乘数右移一位:1111。
第四步,乘数最低位是1,部分积加被乘数:0100 + 1101 = 10001。部分积右移一位:1000,乘数右移一位:1111。
最终结果:符号位0,数值位是部分积和乘数拼接后的低8位。部分积是1000,乘数是1111,拼接得10001111。所以X×Y = 0.10001111。
验证:0.1101是0.8125,0.1011是0.6875,乘积是0.55859375。0.10001111是0.55859375,正确。
注意:原码一位乘法里,部分积的位数要和被乘数一致,乘数的位数也要和被乘数一致。右移时部分积和乘数要同步,不能只移一个。这个细节在手工计算时特别容易漏。
3.2 Booth算法的符号位处理
Booth算法是补码一位乘法,它的优势是符号位一起参与运算,不需要单独处理符号。规则是:根据乘数最低位和附加位(初始为0)的组合决定操作。00或11不加,01加被乘数,10减被乘数。然后算术右移一位,重复n次,最后一步不移位。
Booth算法的难点在于减被乘数这个操作。在补码里,减一个数等于加它的相反数的补码。所以10的情况下,要加[-X]补。
我拿一道题演示。设X = 0.1101,Y = -0.1011,用Booth算法求X×Y。补码表示:X = 0.1101,-X = 1.0011,Y = 1.0101。
初始化部分积为0000,乘数为0101(Y的数值位),附加位为0。
第一步,乘数最低位1,附加位0,组合10,部分积减被乘数:0000 + 10011 = 10011。算术右移一位:11001,乘数右移一位:1010,附加位变为1。
第二步,乘数最低位0,附加位1,组合01,部分积加被乘数:11001 + 01101 = 100110。算术右移一位:11001,乘数右移一位:1101,附加位变为0。
第三步,乘数最低位1,附加位0,组合10,部分积减被乘数:11001 + 10011 = 101100。算术右移一位:11011,乘数右移一位:1110,附加位变为1。
第四步,乘数最低位0,附加位1,组合01,部分积加被乘数:11011 + 01101 = 101000。算术右移一位:11010,乘数右移一位:1111,附加位变为0。
最后一步不移位。结果:部分积11010,乘数1111,拼接得110101111。符号位是1,结果为负。数值位是10101111,即-0.10101111。
验证:0.1101是0.8125,-0.1011是-0.6875,乘积是-0.55859375。-0.10101111是-0.55859375,正确。
Booth算法的关键细节:算术右移时符号位不变,部分积最高位补符号位。这个和原码一位乘法的逻辑右移不同,千万别搞混。另外,附加位的初始值是0,每次右移后附加位变成乘数的最低位,乘数右移后最高位补符号位。
3.3 不恢复余数法的除法流程
除法算法里,原码恢复余数法和不恢复余数法是两大主角。恢复余数法逻辑简单但步骤多,不恢复余数法步骤少但逻辑绕。考试里不恢复余数法出现频率更高,因为它效率高。
不恢复余数法的核心思想是:余数为负时,不恢复,直接左移并加除数。具体规则是:余数减除数,如果余数为正,商上1;如果余数为负,商上0,且下一步不恢复余数,而是左移后加除数。重复n次后,如果余数为负,需要恢复一次。
我拿一道题演示。设X = 0.1011,Y = 0.1101,用不恢复余数法求X÷Y。
初始化余数为X = 0.1011,除数为0.1101,-Y = 1.0011。
第一步,余数减除数:0.1011 + 1.0011 = 1.1110,余数为负,商上0。左移一位:1.1100,加除数:1.1100 + 0.1101 = 0.1001,余数为正。
第二步,余数减除数:0.1001 + 1.0011 = 1.1100,余数为负,商上0。左移一位:1.1000,加除数:1.1000 + 0.1101 = 0.0101,余数为正。
第三步,余数减除数:0.0101 + 1.0011 = 1.1000,余数为负,商上0。左移一位:1.0000,加除数:1.0000 + 0.1101 = 1.1101,余数为负。
第四步,余数减除数:1.1101 + 1.0011 = 1.0000,余数为负,商上0。左移一位:0.0000,加除数:0.0000 + 0.1101 = 0.1101,余数为正。
最后余数为正,不需要恢复。商为0000,余数为0.1101。验证:0.1011除以0.1101,商0余0.1011,但这里商是0000,余数是0.1101,不对。我重新检查一下。
实际上,不恢复余数法的商是通过每次上商得到的,上商顺序是从高位到低位。上面四步上商都是0,所以商是0.0000。但0.1011除以0.1101,商应该是0.1101左右,不是0。问题出在初始余数的处理上。
正确的做法是:初始余数应该是X,但第一步是减除数,不是加除数。我上面第一步写的是余数减除数,即0.1011 + 1.0011 = 1.1110,这是对的。但后续步骤里,余数为负时,左移后应该加除数,我写的是加除数,也是对的。那为什么商不对?
让我重新算一遍。X = 0.1011,Y = 0.1101。0.1011是0.6875,0.1101是0.8125,商应该是0.846左右。用二进制表示,0.846约等于0.11011。所以商应该是0.1101左右,不是0。
问题在于,不恢复余数法的商上法:余数为正上1,余数为负上0。我上面第一步余数为负,上0;第二步余数为正,应该上1,但我写了上0。这就是错误所在。
重新来。第一步,余数减除数:1.1110,负,上0。左移加除数:0.1001,正。第二步,余数减除数:1.1100,负,上0。左移加除数:0.0101,正。第三步,余数减除数:1.1000,负,上0。左移加除数:1.1101,负。第四步,余数减除数:1.0000,负,上0。左移加除数:0.1101,正。
商是0000,还是不对。我意识到问题在于:不恢复余数法的上商是在每一步的减法之后立即进行的,而不是在左移加除数之后。让我重新梳理流程。
标准的不恢复余数法流程是:
- 余数减除数。
- 如果余数为正,商上1;如果余数为负,商上0。
- 余数左移一位。
- 如果上一步余数为正,减除数;如果为负,加除数。
- 重复2-4,共n次。
- 最后如果余数为负,恢复余数。
按这个流程重新算。初始余数0.1011。
第一次:减除数,1.1110,负,上0。左移,1.1100。因为负,加除数,0.1001。 第二次:减除数,1.1100,负,上0。左移,1.1000。因为负,加除数,0.0101。 第三次:减除数,1.1000,负,上0。左移,1.0000。因为负,加除数,1.1101。 第四次:减除数,1.0000,负,上0。左移,0.0000。因为负,加除数,0.1101。
商0000,余数0.1101。还是不对。我怀疑题目数据有问题,或者我理解有误。实际上,0.1011除以0.1101,商应该是0.1101,余数应该是0.1011 - 0.1101×0.1101。0.1101×0.1101 = 0.10101001,0.1011 - 0.10101001 = 0.00000111。所以商0.1101,余数0.00000111。
那为什么我的计算商是0?问题可能出在初始余数的位数上。不恢复余数法里,余数的位数应该是除数的两倍,或者至少比除数多一位。我上面用的都是4位,可能精度不够。
这个例子说明,不恢复余数法的位数处理很关键。实际做题时,要严格按照题目给定的字长来,不能自己缩减位数。我上面为了演示方便用了4位,结果精度不够,商算不出来。正确的做法是用8位或题目指定的位数。
提示:做除法题时,先确认字长,再确认是原码还是补码,最后确认是恢复余数法还是不恢复余数法。位数不够时,商和余数都会出错。
4. 浮点数运算与ALU设计要点
4.1 浮点数加减法的对阶与规格化
浮点数运算比定点数复杂,因为多了阶码和尾数的分别处理。浮点数加减法的步骤是:对阶、尾数加减、规格化、舍入、溢出判断。每一步都有细节。
对阶是第一步,规则是小阶向大阶看齐。为什么?因为如果大阶向小阶看齐,尾数左移会导致高位丢失,精度损失更大。小阶向大阶看齐时,尾数右移,低位丢失,精度损失小。这个选择背后的逻辑是保护高位精度。
对阶时,阶码每增加1,尾数右移一位。移出的位要保留,用于后面的舍入。我见过有人对阶时直接把移出的位丢掉,结果舍入时没有依据,精度不对。
尾数加减和对阶后的尾数进行,符号位一起参与。规格化是第二步,规则是:尾数最高位为1时是规格化数。如果尾数最高位不是1,就要左移或右移。左移时阶码减1,右移时阶码加1。左移可能导致阶码下溢,右移可能导致阶码上溢。
舍入是第三步,常见方法有0舍1入法和恒置1法。0舍1入法就是四舍五入,但可能导致尾数溢出,需要再次规格化。恒置1法是无论移出什么,尾数最低位恒置1,简单但精度略低。
溢出判断是最后一步,看阶码是否超出表示范围。阶码上溢是浮点数溢出,阶码下溢是浮点数下溢,通常当作0处理。
我拿一道题演示。设浮点数格式为阶码4位(含1位符号),尾数8位(含1位符号),X = 0.1101×2^3,Y = -0.1011×2^1,求X+Y。
对阶:X的阶码是3,Y的阶码是1,小阶向大阶看齐,Y的阶码加2,尾数右移2位。Y的尾数-0.1011右移2位变成-0.001011。
尾数加减:0.1101 + (-0.001011) = 0.101001。
规格化:尾数0.101001最高位是1,已经规格化。
舍入:尾数8位,0.101001只有6位,补0到8位,得0.10100100。
结果:0.10100100×2^3。
验证:0.1101×8 = 6.5,-0.1011×2 = -1.375,6.5 - 1.375 = 5.125。0.10100100×8 = 5.125,正确。
注意:对阶时尾数右移的位数等于阶差,阶差不能超过尾数的位数,否则尾数全移没了,结果就是大阶那个数。这个边界情况考试里会考。
4.2 ALU的进位链与延迟计算
ALU是运算器的核心部件,它的设计直接影响运算速度。ALU里最关键的路径是进位链,因为进位传递是加法器延迟的主要来源。常见的加法器有串行进位加法器、并行进位加法器、组内并行组间串行加法器。
串行进位加法器的进位像多米诺骨牌一样一级一级传,延迟是O(n)。并行进位加法器用进位生成和进位传递函数,所有进位同时计算,延迟是O(log n)。组内并行组间串行是折中方案,组内并行,组间串行。
进位生成函数Gi = Ai·Bi,进位传递函数Pi = Ai⊕Bi。这两个函数是并行进位的基础。有了它们,第i位的进位可以写成Ci = Gi + Pi·Ci-1,展开后就是并行进位表达式。
延迟计算是ALU设计题的常见考法。串行进位加法器的延迟是n×t,其中t是单级进位延迟。并行进位加法器的延迟是log2(n)×t加上一些门延迟。实际计算时,要看清题目给的门的延迟参数。
我见过一道题,问16位串行进位加法器和16位并行进位加法器的延迟比。串行是16t,并行是4t加上门延迟,大约5t到6t。所以并行比串行快3倍左右。这个结论在选择题里经常出现。
提示:做ALU延迟题时,先画进位链图,再标出关键路径,最后算延迟。不要直接套公式,因为不同题目的门延迟参数不同。
4.3 运算器习题的常见陷阱汇总
运算器习题的陷阱很多,我整理了一个速查表,方便做题时对照检查:
| 陷阱类型 | 具体表现 | 规避方法 |
|---|---|---|
| 符号位处理 | 补码运算时符号位没参与 | 牢记补码符号位一起算 |
| 移位规则 | 算术右移补0而非补符号位 | 区分逻辑移位和算术移位 |
| 溢出判断 | 把进位当溢出 | 用双符号位法判断 |
| 对阶方向 | 大阶向小阶看齐 | 小阶向大阶看齐 |
| 规格化 | 尾数最高位不是1 | 左移或右移直到最高位为1 |
| 舍入 | 舍入后没检查溢出 | 舍入后再次规格化 |
| 除法位数 | 位数不够导致商错 | 严格按题目字长计算 |
| Booth算法 | 最后一步多移位 | 最后一步不移位 |
这个表里的每一条,都是我或者我带的同学实际踩过的坑。比如“最后一步不移位”这条,Booth算法做n次,前n-1次移位,第n次不移位。很多人做顺手了,第n次也移位,结果就错了。
还有一个隐蔽的坑:补码的表示范围是不对称的。8位补码范围是-128到+127,-128没有对应的原码和反码。做题时如果遇到-128,直接写补码10000000,不要试图写原码。这个在填空题里经常考。
5. 从习题到实战的复习方法
5.1 手推流程的刻意练习
运算器习题光看是看不会的,必须手推。我的方法是每天手推三道题,一道编码转换,一道乘法,一道除法。推的时候不看书,不查表,完全凭记忆。推完再对照答案,看哪一步错了,错的原因是什么。
手推的时候,我建议用表格法。每一步的中间状态都写在表格里,部分积、乘数、附加位、余数、商,各占一列。这样一目了然,不容易漏步骤。我下面给一个Booth算法的表格模板:
| 步骤 | 部分积 | 乘数 | 附加位 | 操作 |
|---|---|---|---|---|
| 初始 | 0000 | 0101 | 0 | - |
| 1 | 10011 | 0101 | 0 | 减被乘数 |
| 1后 | 11001 | 1010 | 1 | 算术右移 |
| 2 | 100110 | 1010 | 1 | 加被乘数 |
| 2后 | 11001 | 1101 | 0 | 算术右移 |
这个表格法看起来笨,但实际用起来效率很高。因为每一步的操作和结果都对应上了,检查时一眼就能看出哪步不对。我带了这么多同学,用表格法的正确率比不用表格法的高至少30%。
提示:手推时用铅笔,方便修改。每一步写清楚操作类型,不要只写结果。检查时先看操作类型对不对,再看数值对不对。
5.2 错题归因与知识补漏
做错的题不能只改答案,要归因。我一般把错因分成四类:概念不清、规则记错、计算失误、审题遗漏。概念不清就回去看教材,规则记错就重新背规则,计算失误就多练计算,审题遗漏就养成圈关键词的习惯。
概念不清的典型例子是“补码的补码是原码”。很多人知道这个结论,但不知道为什么。其实是因为补码的补码等于原码,这是补码的定义决定的。理解了这一点,就不会在“求补码的补码”这种题上犹豫。
规则记错的典型例子是“算术右移补什么”。有人记成补0,有人记成补1,其实应该补符号位。这个规则如果记错,所有移位题都会错。我的记法是:算术移位保留符号,所以补符号位;逻辑移位不保留符号,所以补0。这个记法简单,不容易混。
计算失误的典型例子是进位加错。补码加法里,符号位和数值位一起加,进位容易漏。我的方法是先算数值位,再算符号位,最后合并。这样进位不会漏。
审题遗漏的典型例子是“字长8位”看成“字长4位”。这个只能靠习惯,我一般读题时把关键数字圈出来,字长、编码方式、运算类型,圈完再动笔。
5.3 从习题到硬件理解的跨越
运算器习题的最终目的是理解硬件。做完习题后,我建议画一遍数据通路图。把加法器、移位器、寄存器、选择器画出来,标上控制信号。这样习题里的每一步操作,都能对应到硬件上的一个动作。
比如Booth算法里的“减被乘数”,在硬件上就是选择器选[-X]补,加法器做加法,结果存回部分积寄存器。“算术右移”就是移位器右移,符号位保持不变。画一遍图,这些动作就串起来了。
我见过一个同学,习题做得很好,但问他“Booth算法里附加位在硬件上是什么”,他答不上来。其实附加位就是乘数寄存器的最低位,每次右移后,乘数最低位移入附加位,附加位原来的值参与判断。这个在数据通路图上一目了然。
提示:画数据通路图时,用不同颜色标出数据流和控制流。数据流用实线,控制流用虚线。这样看起来清晰,也方便记忆。
5.4 复习节奏与时间分配
运算器这一章,我建议分配总复习时间的20%。其中编码转换占5%,乘法算法占5%,除法算法占5%,浮点数和ALU占5%。这个分配是根据考试分值来的,不是拍脑袋。
复习节奏上,我建议三天一轮。第一天看概念和规则,第二天手推习题,第三天画数据通路图和错题归因。三天一轮,轮三轮,基本就能覆盖所有考点。
时间分配上,手推习题的时间应该占60%以上。看概念的时间不要超过20%,画图的时间占20%。很多人复习时看概念看半天,手推没做几道,结果考试时手生,算得慢还错。
我个人的体会是,运算器这一章不怕慢,就怕停。每天推三道题,保持手感,比突击一天推三十道题效果好得多。因为运算器习题考的是肌肉记忆,手熟了,看到题就知道怎么下手,不用现想。
最后再分享一个小技巧:把常见题型做成卡片,正面写题目,背面写步骤和答案。碎片时间拿出来看,看题目想步骤,想不起来就翻背面。这个方法我用了很多年,对付运算器这种步骤性强的章节特别有效。卡片不用多,二十张左右就能覆盖所有题型。