0. 问题描述

本文包括4位二进制乘法(4位乘4位)和8位二进制除法(8位除4位)的详细计算过程。

1.创作原因

计组实验中的涉及到此问题,当时上网查阅了许多博客和资料都没能理解这两者的计算过程,并且我发现许多资料上的计算过程显得非常繁琐、晦涩,明明两三句话就可以讲明白的东西偏要说的不明不白,细节的地方忽略,计算过程示例也很少且不清楚,导致我遇到了很大困难。后来历经磨难终于理解了这两个计算过程,当时就决心要写一篇博客把这个用最简单但却最详细的话讲清楚,为后来者提供便利,少走一些弯路,多节约一些时间。
下面我们直接开始吧~

2.二进制乘法

被乘数设为5:101B
乘数设为7:111B

开始计算之前设置一个变量N保存乘法的最终结果,初始化为0。
则有详细的计算过程如下:

  1. 判断乘数111B的最后一位为1,则N加上被乘数,N更新为0+5=5
  2. 乘数右移一位更新为11B,被乘数左移一位更新为10
  3. 判断乘数11B最低位为1,则N加上被乘数,N更新为10+5=15
  4. 乘数右移一位更新为1B,被乘数左移一位更新为20
  5. 此时乘数1B最低位为1,则N加上被乘数,N更新为20+15=35
  6. 乘数右移一位更新为0,被乘数左移一位更新为40
  7. 此时检测乘数为0,循环结束,N的最终结果为35,即为乘法的结果

下面来总结一下整个计算过程的要点:

  • 继续循环还是结束循环取决于什么时候乘数变为0
  • 每一次循环中如果乘数最后一位为1则N加上被乘数;为0则不加上被乘数

下面再来看一下它的思想是什么:
我们知道8∗8=16∗4=32∗2=64∗1=648*8=16*4=32*2=64*1=648∗8=16∗4=32∗2=64∗1=64, 这个乘法的特点就给了我们计算二进制乘法的思路,二进制中左移是乘2,右移是除2,如果被乘数左移乘数右移那么他们的乘积是不变的,即:100B∗10B=1000B∗1B=1000B=8100B*10B=1000B*1B=1000B=8100B∗10B=1000B∗1B=1000B=8。但是如果乘数的末位为1的话不能简单地进行左移右移,设想如果不加处理乘数直接右移那么结果就会丢失掉一个被乘数的大小,这也就是为什么如果判断末位为1结果就要加上一个被乘数的原因。

8位乘8位的结果需要16位保存,其计算过程也与上方相同,只是需要涉及的寄存器更多,更加复杂一些。

3.二进制除法

被除数24:11000B
除数5:101B

开始计算前我们设置一个N表示商,其值初始化位0。
则有详细的计算过程如下:

  1. 将除数的最高有效位左移至与被除数的最高有效位对齐,这里将除数101B左移两位即可,除数更新为10100B
  2. 用被除数11000B减除数10100B,发现减得过来,因为减得过来,所以商+1,商更新为N=1。减法的结果为100B,所以被除数更新为100B
  3. 用被除数100B减除数10100B,发现减不过来,因为减不过来,所以除数右移一位,更新为1010B;因为除数右移一位,所以商左移一位更新为N=1*2=2 (注:左移就是与2做乘法)
  4. 用被除数100B减除数1010B,发现减不过来,所以除数右移一位,更新为101B;因为除数右移一位,所以商左移一位更新为N=2*2=4
  5. 发现现在除数的大小又变回了最开始的大小101B,则循环结束。所以现在的N=4就是除法结果,现在的被除数100B就是除法的余数
  6. 结束,结果正确

下面来总结一下整个计算过程的要点:

  • 有许多资料可能会设置一个计数器,但我采用的的是另外的方法,和计数器其实是差不多的。除法进行到最终,除数一定要与最开始的除数相等,如果不相等则需要除数一直右移直至相等为止,相应的商也要左移同样的位数(这其实就是整除的情况)
  • 循环继续还是停止取决于除数是否与最开始的除数相等
  • 循环中,用被除数减除数,如果减得过来就用减法结果更新被除数并商+1;如果减不过来除数就右移一位,商左移一位
  • 减不减得过来其实就看在做减法的过程中是否产生借位就可以了,在汇编语言中可以体现为标志位CF是否为1

下面我再举一个整除的例子:
被除数8:1000B
除数2:10B

计算开始:

  1. 除数10B左移两位,更新为1000B
  2. 被除数1000B减除数1000B,减得过来所以商+1,商更新为N=1;减法的结果为0所以被除数更新为0
  3. 被除数0减除数1000B,减不过来所以除数右移一位更新为100B,因此商左移一位更新为N=1*2=2
  4. 被除数0减除数100B,减不过来所以除数右移一位更新为10B,因此商左移一位更新为N=2*2=4
  5. 此时除数已经等于原来的除数所以循环结束,除法的商为4,余数等于此刻的被除数0
  6. 除法结束,结果正确

你是否对上面有一点说法有所疑惑?我在上面说到了如果什么时候除数与最开始的除数相等则结束循环,那么肯定有人会想,如果刚开始除数就不需要左移(这个时候被除数与除数位数相同),这时候是不是只进行一次循环就停止呢?

举一个除数不需要左移的例子:
被除数14:1110B
除数9:1001B

还是设除法的商为N,初始化为0。
则有详细的计算过程如下:

  1. 除数1001B与被除数1110B最高有效位对齐,所以无需左移
  2. 被除数1110B减1001B,发现减得过来,则商+1,N更新为N=0+1=1;减法结果为101B,则被除数更新为101B
  3. 被除数101B减除数1001B,发现减不过来,再发现此时除数与最开始的除数相等,所以除数无需右移,计算直接结束
  4. N=1为最终的商,被除数为101B则为除法的余数

那么上面的计算过程需要注意这些地方:

  • 注意你需要在计算的什么地方判断除数是否等于最开始的除数,也就是说你需要明白你应该把判断除数这一过程放在步骤的哪一步才能让计算正确的结束,这需要思考
  • 这个计算过程能够正确计算被除数小于除数的情况

它的计算思想就不细说了,在上述计算过程中都有所体现。
我用汇编语言分别实现了这两个计算过程,如下:

4.汇编实现

4.1 4乘4乘法

    mov R0, #9mov R1, #7mov R2, #0mov A, R0and A, R0jz OVER;check zero
LOOP:mov A, R1and A, R1jz OVER;check zeroand A, #1jz TAG2mov A, R2add A, R0mov R2, A
TAG2:mov A, R1shr R1mov A, R0shl R0jmp LOOP
OVER:halt

4.1 8除4除法

        mov R1, #3;除数mov R2, #0;商mov A, R1mov 90, A;把除数存储起来;计算计数器的值
JUDGE_CNT:mov A, R1and A, #80hjz RM;如果是0就左移jmp JUDGE_CNT_END
RM:shl R1jmp JUDGE_CNT
JUDGE_CNT_END:mov A, R0sub A, R1jc ADD_BACK_MOVE;不够减加回去,除数右移;够减商加一,被除数更新mov R0, Aadd R2, #1       ADD_BACK_MOVE:;不够减的情况;除数右移一位mov A, R1sub A, 90jz OVER;减到原除数大小结束shr R1shl R2jmp JUDGE_CNT_END
OVER:jmp OVER

4.3 说明

这两个汇编程序不是8086那套东西所以可能有不一样的地方,不用在意,大家只需要关注其中的计算过程即可。

5.ending

若有疑问可以在评论区提出一起来探讨,对你有帮助的话别忘了点赞喔~

二进制乘法、除法的计算过程解读相关推荐

  1. 矩阵乘法次数的计算过程

    矩阵乘法次数的计算: 以两个矩阵相乘为例,A1xA2,A1和A2为两个矩阵,假设A1的行列数是pxq,A2的行列数是qxr.那么对于A1xA2而言,我们需要分别执行pxr次对应A1的行元素乘以A2的列 ...

  2. 二进制补码乘法除法_二进制乘法和除法

    二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制 ...

  3. c语言中的除法求商例题,二进制除法商怎么计算?101001000除以1101怎么求商,求步骤...

    二进制除法商怎么计算?101001000除以1101怎么求商,求步骤 答案:3  信息版本:手机版 解决时间 2019-01-08 17:35 已解决 2019-01-07 23:30 二进制除法商怎 ...

  4. python计算小数点后有几位_数学提高小数除法竖式计算过程

    除数是小数时:先把除数变成整数,除数扩大到原来的多少倍,被除数也要扩大到原来的多少倍(即小数点也向右移动几位,位数不够的用0补),然后按照除数是整数的除法进行计算.计算小数除法,除到被除数的末尾仍有余 ...

  5. Python模拟大整数乘法的小学竖式计算过程

    让我们先看个图回顾一下小学学过的计算整数乘法的竖式计算过程 然后再来看如何使用Python来模拟上面的过程,虽然在Python中计算任意大的数字乘法都没有问题,但下面的代码作为一个算法的理解还是不错的 ...

  6. 加法、乘法、除法贡献度计算实现

    一 .加法贡献度计算 import pandas as pd import numpy as np df = pd.read_csv("C:/Users/supaur/Desktop/tes ...

  7. 计算机数值中的乘法除法原理

    乘法:被分解为左移累加. 除法:被分解为右移累减去,减法可以转换为加法. 浮点数的运算: S x 2(^F) x M 浮点数是原码表示法,S符号位,F阶码 + 127, M尾数舍弃前面的1(如果F&l ...

  8. java中小数的乘法_javascript的小数点乘法除法实例

    javascript的小数点乘法除法实例 导语:想要学好Java语言,必不可少的就是它的四则运算,特别是乘除法.下面的是百分网小编为大家搜集的javascript的小数点乘法除法实例,希望可以帮到你. ...

  9. 5.5 除法的运算过程

    计算机组成 5 乘法器和除法器 5.5 除法的运算过程 在加.减.乘.除这样的基本算数运算当中,除法是最为复杂的.因此,我们想要实现硬件的除法器,还是从最简单的情况开始说起. 我们还是采用纸笔进行模仿 ...

最新文章

  1. iOS 在每一个cell上添加一个定时器的方案
  2. 最新开源!TransReID:首个基于Transformer的ReID网络,各项任务全面领先!
  3. linux系统photoshop安装教程,在ubuntu中安装photoshop cs6
  4. 【docker】第四节:通过docker容器,进行部署fastadmin。
  5. uuid.randomuuid()回重复么_【编译器玄学研究报告】第三期——“O0” 就能逃出优化的魔爪么?...
  6. malformed utf-8 characters, possibly incorrectly encoded
  7. 模板方法模式【Template Method Pattern 】
  8. [2019年国庆专题训练] dp专题训练
  9. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——图表设计和透视表
  10. ubuntu 改屏幕分辨率命令_Ubuntu修改屏幕分辨率
  11. puzzle(0131)《迷宫》
  12. 地平线摄像头的音频调试至国际平台
  13. 全国首个数字产权区块链平台上线,共享购模式悄然上市
  14. 失眠睡不着觉怎么办?这些助眠好物帮助你走出失眠
  15. 常量的定义与使用与变量的定义与使用
  16. 什么是前向纠错(FEC)?FEC最全解析
  17. 4.1.3.9 监听网络状态,3G,WIFI,
  18. vue指令模式 添加埋点
  19. 微软近日更新网页版Skype增通知版面和关键词搜寻
  20. Erase/Trim/Discard/Sanitize

热门文章

  1. php libtool,web/libtool.zh.php at master · fink/web · GitHub
  2. 北京公积金购买二手房攻略
  3. C#操作SqlServer MySql Oracle通用帮助类Db_Helper_DG(默认支持数据库读写分离、查询结果实体映射ORM)...
  4. sdut2190-救基友记1
  5. 21 Redis 缓冲区的用法
  6. linux 串口八字节,四柱推命基本法则源头、收局、阻节
  7. 如何塑造社群荣誉感与归属感
  8. 地理信息系统相关软件技术杂志
  9. GaussDB OLTP云数据库配套工具DRS
  10. 奶爸日记7 - 剥橙子