zoukankan      html  css  js  c++  java
  • 二进制乘除的原理

    ---二进制乘--
    --二进制乘法是什么原理?_作业帮 https://qb.zuoyebang.com/xfe-question/question/8f969ea92ce2f4a910ad51c9734ac713.html
    二进制乘法原理:
      就是左移(进位)8次,每次最高位为1则加进去,8位移完就得出乘积了
      实际上和我们做10进制的乘法是一样的,只不过这里的进制是2罢了
      比如5×6,转成二进制就是0101×0110
      十进制乘法大家都会做,公式就是
      我们他当成十进制101×110来计算下看看
    4位乘积=被乘数×千位被+被乘数×百位+被乘数×十位+被乘数×个位
      既0101×0110=101×0000+101×100+101×10+101×0
      变化下:
    4位乘积=被乘数×千位数×1000+被乘数×百位数×100+被乘数×10位数×10+被乘数×个位数
      既0101×0110=101×(0×1000)+101×(1×100) +101×(1×10)+101×0
      再变化下:
    4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
      既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
    =(((101×0)×10)+(101×1))×10+(101×1))×10+101×0
      我们可以看到,实际上乘法结果就是被乘数乘以每一位乘以模(10)的N次方的累计和(其实左移位就是进位啦,看得出来吗?)
      而换成2进制的话很简单,把10读成二进制2就行了,结果还是:
    4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数
      既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
    =(((101×0)×2)+(101×1))×2+(101×1))×2+101×0
    由于乘2就是移位(进位),把上面的公式中乘2换成左移位就行了
      PS:
      由于二进制只有0和1,乘2可以用左移一位来实现,也可以“自己加自己”来实现的,很多CPU的左移指令和“自己加自己”一样
      用软件乘法要耗费很多CPU时间,只要CPU有硬件乘法器,当然是用硬件的了,哪会快很多的.

    ---二进制除----
    ---除法运算就是移位和相减_cenzmin的专栏-CSDN博客 https://blog.csdn.net/cenzmin/article/details/47311901
    2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下:
    1 - 1110 不够减, 结果添0, 1左移一位再加上原来1后的0,为10 。
    10 - 1110 不够减, 结果添0, 10左移一位再加上原来10后的1,为101 。
    101 - 1110 不够减, 结果添0, 101左移一位再加上原来101后的1,为1011 。
    1011 - 1110 不够减, 结果添0, 1011左移一位再加上原来1011后的0,为10110 。
    10110 - 1110 = 1000 结果添1,同上左移加原来10110后的1得 10001 。
    10001 - 1110 = 11 结果添1,同上左移加原来101101后的1得 111 。
    111 - 1101 不够减,结果添0,此时1011011所有位都已移完,运算完毕 。
    即 1011011 = 1110 * 0000110 + 111 。
    也即 91 = 14 * 6 + 7 。
    由于你相除的两个数放在两个数组中,比如A[]与B[],要模拟这种运算的话就需要能不
    断地从A中取出其二进制的高位,添加到一个当前值的数组C[]中,而实际进
    行运算的就是C与B。数组单元的类型必然是多位的,你必须要实现做到对数组C[]左移
    一位的操作,剩下的就是判断C够不够减B(即C数组的数是不是比B大)了。

    至于左移,我想大家都想到了,其实C和B是倒序存放的,以数组单元为8位为例,
    C[0]存放着C的最低8位,用表达式表示就是 C[0] = C & 0xff, C[1] = C & 0xff00, ...
    这样当移位时,只要保留当前单元C[i]的最高位,即h = C[i] > > 7,然后直接对
    C[i]左移一位即 C[i] < <1,然后再加上上一单元C[i-1]保留的最高位即得到当前的C[i]
    对于C[0]来说,它的上一单元的最高位自然就是A的最高位了。

  • 相关阅读:
    【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
    SQL Server常用的性能诊断语句
    Oracle常用的性能诊断语句
    【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)
    数据库管理与开发工具推荐---DBeaver
    DM达梦数据库---执行计划查看
    DM达梦数据库索引失效的处理---强制更新统计信息
    jProfiler、jMAT等工具注意设置启动的Xmx参数
    JVM启动参数建议
    Linux环境jcmd抓取进程信息及内存dump
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/15147423.html
Copyright © 2011-2022 走看看