zoukankan      html  css  js  c++  java
  • CPU 底层运算之乘法运算

    CPU 运算加减法运算
      假设计算  3+3 
      原码是0011 * 0011(以4位存贮单元,因为是原码,最高位不代表符号位)
      1. 首先 判断 两个加数是否有 负数(减法)  如果有 负数 先将负数转为补码进行运算
      2. 然后将两个正数相加 所以计算机底层只进行加法运算
        正数的补码 反码 源码都是本身  负数的补码 是先将正数求反码 然后将反码+1 得到该正整数的补码 
     
    模拟CPU运算乘法的步骤:
      假设计算3*3
      原码是0011 * 0011(以4位存贮单元,因为是原码,最高位不代表符号位)
    CPU中的乘法器过程如下
      3个寄存器分别存放乘数0011 被乘数 0011 一个部分积初始值为0
      1、首先判断乘数寄存器(目前为0011)的最低位为1。如果为1则将部分积的值通过加法器加上被乘数0011。因此此步结束后部分积寄存器内容为0011
      2、将乘数寄存器右移一位,同时将部分积寄存器也右移一位。同时乘积寄存器最低位溢出丢弃。部分积寄存器高位补0,地位溢出后填充到乘数寄存器。因此。部分积寄存其原来的值0011变成了0001。乘数寄存器0011变成了1001(这里低位的1溢出,最高位被部分积溢出的1填充)
      3、判断乘数寄存器最低位(0001).为1。将部分积通过加法器加上被乘数0011。因此此不结束后部分积寄存器内容是(0001+0011=0100).
      4、乘数寄存器右移一位,同时将部分积寄存器也有右移一位。同第2步。因此部分积寄存器原来的值0100变成了0010。乘数寄存器1001变成了0100,低位1溢出,最高位被部分积溢出的0填充。
      5、判断乘数寄存器低位为0不做加法操作直接做第2步的移位操作。既有了部分积变成0001,乘数变成了0010。
      6、判断乘数寄存器低位为0不做加法操作直接做第2步的移位操作。既有了部分积变成0000,乘数变成了1001;此时所有乘数全部处理完毕。
      7、最终结果将部分积作为高位,乘数寄存器作为低位得到值为00001001 换算成10进制得到9

     CPU中的除法器过程如下

      首先初始化三个寄存器存放被除数,除数,部分商,部分商会初始化为0(可初始化也可以不初始化因为会做上商过程)
      首先把被除数寄存器左移2位与除数寄存器对齐:
      1010<<2=10(10)
      在用对齐后的被除数与除数做比较:
      10(10)-10=00 刚好等于没有溢出所以上商1,商为0001,在将相减的结果(00)放到被除数有效的高位此时被除数有效的最高位为10(10),此时被除数的bit位为0010,
      在左移1位:
      0010<<1=001(0)
      在用位移后的被除数与除数做比较:
      001(0)-10=11 符号位为1负数也就是说被除数小于除数所以上商0,商为0010
      在左移0位
      0010<<0=0010
      在用位移后的被除数与除数做比较:
      0010-10=00 两个符号位都为0相等所以上商1,商为101,在将其放到商的有效高位此时被除数的有效bit位为最低的两位(00)10
      所有的被除数处理完后商做结果被除数做余数,商为101,余数为00,转换成十进制就是5余0!

  • 相关阅读:
    Android开发之日历控件实现
    聚集索引和非聚集索引(整理)
    Android调用WebService(转)
    Android Design
    Android应用的自动升级、更新模块的实现
    Row_Number() OVER 的用法
    WITH AS短语,也叫做子查询部分(subquery factoring)
    创建安卓项目图解
    Android权限设置android.permission
    类型初始值设定项引发异常
  • 原文地址:https://www.cnblogs.com/wsming/p/13208816.html
Copyright © 2011-2022 走看看