从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑( 二 )


文章图片
乘以十位列
在“个位”列上移动四颗珠子30次以上会很乏味 。 幸运的是 , 我们不必这么做 。 相反 , 我们执行一个移位操作来加快加法的速度 。 我们把每一颗移动的珠子算作十乘以四 。 这是怎么做到的?每次我们移动计数器十位上的一个珠子 , 我们就移动累加器十位上的四个珠子 。 执行此操作一次 , 计数器从30减少到20 , 累加器增加到48(8+4×10) 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
我们再次重复相同的操作 , 从而将计数器从20减少到10 , 并向累加器添加另一个40 , 现在它的值为88(48+4×10) 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
注意 , 在上图中 , 我们不能再向下移动4个珠子 , 因为累加器的十位列中只剩下2个珠子 。 我们需要使用第三列 , 用累加器表示百位 。 我们用十位上的十颗珠子换百位上的一颗珠子 。
此外 , 十位总共需要12颗珠子 , 我们用它来交换百位的1颗珠子和十位的2颗珠子 。 此时 , 我们已经花光了计数器上的所有珠子 , 可以看到最终的结果是128 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
移位操作
用算盘、机械计算器或ALU都不能直接做乘法和除法 。 然而 , 我们可以轻易地用10的倍数相乘 。 用10、100或1000乘以一个输入数字很容易 , 你所要做的就是移动1、2或3列的珠子 。 做2×4需要移动个位列中的4个珠子两次 。 如果想执行20×4 , 则将十位列中的四个珠子移动两次 。 如果是200×4 , 这意味着在百位列中移动8个珠子 。 你所做的实际上是加法运算和移位运算的结合 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
如果你看机械计算器 , 你将看到累加寄存器位于一个滑动条上 。 向左滑动一个缺口 , 从输入寄存器中添加的数字将是原来的十倍 。 向左边滑动两个凹槽 , 输入的数字就会变为原来的100倍 。 我们也可以向右滑动 , 使相加的数字变小 。 一个有趣的效果是 , 滑动杆做移位 , 它也影响计数寄存器 。 假设你指定输入寄存器为42 。 接下来 , 将杆向左滑动两个凹槽 。 当你转动手柄将输入加到累加器中时 , 你将加4200 。 计数寄存器上会显示100 。 因此 , 它看起来就像你拧了手柄一百次一样 。 换句话说 , 移位允许我们大幅减少执行加法的次数 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
这些移位操作与我们在算盘上实现的没有什么不同 。 关键的区别在于 , 你需要通过手动移动珠子来更新累加器和计数器 。 微处理器中移位运算的使用
移位运算帮助我们加快微处理器ALU上的乘法和除法运算 。 因为现代的微处理器是用二进制数字系统操作的 , 移位操作的是2的倍数的多个输入 。 因此 , 我们不是用10、100、1000或10000乘以输入 , 而是用2、4、8、16、32等等乘以输入 。
从算盘到微处理器的底层逻辑算盘到微处理器的底层逻辑
文章图片
开始编程时 , 这种知识实际上很有用 。 在20世纪90年代初 , 个人电脑的乘法运算非常缓慢 。 我们必须使用乘法来计算像素在图形存储器中特定x,y坐标处的位置 。 因为屏幕分辨率是320×240 , 你必须把y坐标乘以320 , 然后加上x坐标 , 才能得到屏幕内存中的位置 。
关键是 , 我必须将任意数y乘以320无数次 。 这是非常慢的 。 解决方案是将计算改为移位和加法的组合 。 以下是一个简介: