计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)

本文详细解释了计算机如何实现乘法和除法运算,通过二进制位移和累加/累减的方法来完成基本算术操作。文章通过具体实例展示了乘法中左移累加的过程及除法中右移累减的步骤。

http://blog.youkuaiyun.com/blues1021/article/details/42849183

前言

  • 虽然我们在编程语言中可以直接使用+-/,但是对某些要求不能用/的情况下,我们有必要了解一下计算机是怎样完成乘除法的。
  • 首先,我们要明确一下计算机所能完成的最基本操作是:+(-)和左移右移。虽然ISA中一般都有MUL类指令,但是这些经过译码之后最终的元操作还是加法和移位指令。

乘法实现

  • 我们知道在计算机中只有0和1,于是,就有了二进制计数,比如5 = 101. 抽象的说,任何一个数均可以表示为如下式子: 
    这里写图片描述 
    所以其他数乘以X,就变成了如下式子: 
    这里写图片描述 
    这就是计算机做乘法的原理。因为对于计算机而言,左移一位代表乘以2,右移一位代表除以2。所以,对于a乘以x而言,只是将a左移x为1的位并累加即可。

举例说明:5*3

  1. 3=0011(不用分解,计算机就是这么存储的)
  2. 3的第0位1,5左移0位仍为0;
  3. 3的第一位为1,5左移1位为5*2 = 10
  4. 然后将其累加,得到最后结果15.

代码如下:

//没有考虑传入数太大,导致溢出的情况。只做简单说明
int getBits(int num){
    int numLen = 0;
    while(num){
        numLen++;
        num = num>>1;
    }
    return numLen;
}

int getIndexBit(int num,int pos){//获取从右到左的第pos位置的值1/0
    int index = 1<<pos;
    if((num&index)>>pos)
        return 1;
    else
        return 0;
}
int getBit(int num,int pos){//获取从右到左的第pos位置的值1/0
    pos = pos-1;
    return getIndexBit(num,pos);
}
int multi(int multi1,int multi2){
    bool minus = false;
    if(multi2<0){
        minus = true;
        multi2 = -multi2;
    }
    int length = getBits(multi2);
    int index = 0;
    int base = multi1;
    int sum = 0;

    while(index<length){
        int val = getBit(multi2,index+1);
        if(val)
            sum+=(base<<index);
        index++;
    }
    if(minus)
        return -sum;
    return sum;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

除法实现

除法实现起来要比乘法难一点,因此,让我们首先从人的角度来计算一下除法的实现。

人类计算除法

当我们在计算51/3=17,抛开9*9乘法表。

  1. 从被除数的最高位5开始,从0-9选一个数,使得5-i*3>=0且使5-(i+1)*3<0。我们选择了1. 余数为2.
  2. 将余数*10+1=21,继续从0-9中选一个数,使得21-3*i>=0且使5-(i+1)*3<0,我们选择了7.
  3. 由此,我们找到了答案17。

计算机计算除法

计算机计算除法的过程与人类计算的过程很类似,只是选择范围变成了0或1. 
还以51/3为例说明(51:110011;3:11)

  1. 从第一位开始为1,小于11,结果位置0;余数为1
  2. 从第二位开始,余数*2+1=11,等于11,结果位置1,余数为0;
  3. 从第三、四位开始,余数*2+0=0<011,结果位置0,余数为0
  4. 从第5位开始,余数*2+1=1<11,结果置0,余数为1
  5. 从第6位开始,余数*2+1=11=11,结果置1,余数为0.

此时将结果位相连,恰好是10001(17)

 

 

乘法:被分解为左移累加。

除法:被分解为右移累减去,减法可以转换为加法。
浮点数的运算:
S x 2(^F) x M
浮点数是原码表示法,S符号位,F阶码 + 127, M尾数舍弃前面的1(如果F<=-127则小数最前是0也要舍弃,后面补上0,F会变为-126)。
F阶码用的表示法是偏移码(无符号整型表示,并不是书本说的移码,阶码加减运算的时候,应该用了寄存器处理,不是移码运算,因为位数都不够)。
浮点数加减:阶码对齐; 尾数加减,处理溢出,规格化即可。
浮点数乘除:无符号阶码偏移码加减运算,应该是转换为真值后,进行了有符号补码的运算,得到结果,而不是进行了移码的运算(因为移码运算得不到正确的结果);尾数进行整数乘除,得到结果处理溢出,规格化即可。
 

计算机乘法除法原理(原码)

  (2013-12-04 16:09:30)
转载
标签: 

计算机

 

乘法

 

除法

 

原理

 

原码

 

it

分类: 软件技术规范
1.乘法
由于计算机中,所有数值都是用2的N次方来表示的:2^n0+2^n1+2^n2+2^n3+2^n4.....
因此x*y,(x)*(2^n0+2^n1+2^n2+2^n3+2^n4)=(x*2^n0)+(x*2^n1)+(x*2^n2)+(x*2^n3)+(x*2^n4)+......即(x左移n0)+(x左移n1)+(x左移n2)+(x左移n3)+(x左移n4)+......

用15(x)*13(y)来举例,15*13 为1111*1101
a.首先y的最低位为1(2^0),x左移0位得到1111
b.然后y的最低第二位为0,没有2^1存在,因此本次无运算(结果可以看作为0)
c.然后y的最低第三位为1(2^2),x左移2位得到111100
d.然后y的最低第四位为1(2^3),x左移3位得到1111000
e.把a、b、c、d的结果相加1111+0+111100+1111000=11000011(195),该结果就是乘法的结果

特别的,x*y中,如果y是2的N次方,因此相当于x右移N位。

2.除法(加减交替法)
x/y其实就是,x不断减y的过程。小学时候学的长长除法就是这个原理。
用二进制的除法x/y,比十进制容易写,商不是0即是1,而且如果除数大于除数的1倍,商就是标记在另一个位上面了

二进制除法x/y=0.1001/0.1011手工计算如下
            0.11  
       _______
0.1001/0.1001
         10010(后面补0)
         -1011
        ------
           111(余数)
           1110(后面补0)
          -1011
        --------
              1(余数)
              
设ri表示第i次运算后所得的余数,则:
若ri>0,则商1,余数和商左移1位,再减去除数,即ri+1=2ri-y
若ri<0,则商0,余数和商左移1位,再加上除数,即ri+1=2ri+y

用85/6来举例,85/6=1010101/110
a.101(0101)左移1位到第3位都小于110,因此商=000
b.1010(101)左移四位是1010,比110大,商=0001,余数=1010-110=100(101)
c.余数100(101)左移一位是1001,比110大,商=00011,余数=1001-110=11(01)
d.余数11(01)左移一位是110,等于110,商=000111,余数=0(1)
e.余数0(1)左移一位是01,小于110,商=0001110,余数=01

因此85/6=1010101/110=0001110,即14,余数为最后的余数1
<think>嗯,用户问的是计算机怎么计算乘法除法和减法的。我需要先回顾一下之前的问题,用户之前问过加法和按位或的区别,以及左移和乘法的效率比较。看来他对底层运算机制挺感兴趣的,可能是在学习计算机组成原理或者想优化代码性能。 首先,用户可能想知道计算机如何实现这些基本运算,特别是背后的硬件机制。比如,加法是通过全加器,乘法可能用移位和加法组合,除法类似长除法,减法用补码转换加法。这些都是计算机组成的基础知识,但用户可能希望了解更详细的实现方式,比如具体的算法或电路设计。 然后,用户可能对效率差异感兴趣,比如为什么左移比乘法快,或者除法为什么比乘法慢。需要解释不同运算的复杂度和硬件实现的不同。比如,乘法可能需要多个时钟周期,而除法更复杂,尤其是处理浮点数时。 还要注意用户可能的实际应用场景,比如在编写高性能代码时,是否应该用位移代替乘除法。这时候需要提到编译器优化,以及现代CPU的指令集优化,比如硬件乘法器的存在,但除法仍然可能较慢。 需要分步骤解释每个运算的实现方式,从二进制层面开始,然后到硬件电路,再到指令集和汇编层面。可能还要举例子,比如用二进制加法器构建乘法器,或者使用Booth算法进行乘法优化。对于除法,可能涉及恢复余数法或非恢复余数法,以及现代CPU中的SRT除法。 另外,用户可能想知道这些运算在不同架构(如x86和ARM)中的差异,或者在不同数据类型(整数和浮点数)上的处理方式。比如,浮点运算通常由FPU处理,使用更复杂的算法,涉及规格化、舍入等步骤。 最后,要确保回答结构清晰,分点解释每个运算,并总结效率问题,给出实际应用的建议。同时,相关问题要引导用户深入思考,比如硬件优化、算法选择对性能的影响,或者编译器的作用。</think>计算机通过组合逻辑电路和特定算法实现乘法除法和减法运算,其底层机制与二进制特性紧密相关: --- ### 1. **减法(Subtraction)** #### 实现原理: - **补码运算**:计算机将减法转换加法处理 `A - B = A + (-B)`,其中 `-B` 是 `B` 的补码(取反加1)。 - **硬件电路**:使用加法器配合异或门控制补码输入(通过控制信号切换加减模式)。 #### 示例(4位二进制): ```bash 5 (0101) - 3 (0011) = 0101 + 1101 (补码表示-3) = 0010 (结果为2) ``` --- ### 2. **乘法(Multiplication)** #### 整数乘法: - **移位相加法**:类似十进制竖式乘法 `A × B = A × Σ(b_i×2^i)`,逐位判断B的二进制位是否为1,若为1则左移A后累加。 - **硬件优化**:使用**移位寄存器**和**加法器阵列**,现代CPU采用**布斯算法(Booth)**优化带符号数运算。 #### 示例(3×3): ```bash 0011 (3) × 0011 (3) = 0011 << 1 + 0011 << 0 = 0110 + 0011 = 1001 (9) ``` #### 浮点乘法: - 分开处理阶码和尾数: 阶码相加,尾数相乘后规格化(IEEE 754标准)。 --- ### 3. **除法(Division)** #### 整数除法: - **恢复余数法**:类似长除法,通过循环移位和减法实现 `商 = 被除数 ÷ 除数`,每次试商决定是否减去除数。 - **非恢复余数法**:优化版,避免重复加法,减少运算步骤。 - **硬件实现**:需要比较器、移位寄存器和加减法单元。 #### 示例(7÷3): ```bash 初始余数=0111 (7), 除数=0011 (3) 1. 左移余数 1110,减除数 0011 → 1011(负数,恢复余数) 2. 商位置0,最终商=0010 (2),余数=0001 (1) ``` #### 浮点除法: - 阶码相减,尾数相除后规格化,需处理舍入和异常(如除零)。 --- ### 4. **效率对比(现代CPU)** | 运算类型 | 延迟(时钟周期) | 说明 | |----------|------------------|------| | 减法 | 1 | 与加法同速(补码共享加法器) | | 乘法 | 3-5 | 整数乘法有专用硬件加速 | | 除法 | 10-30 | 复杂度高,部分架构用迭代算法 | > ⚠️ **注意**:除法效率远低于乘法,浮点运算需FPU支持,现代CPU通过**流水线**和**微码**优化复杂运算。 --- ### 5. **实际应用建议** - **优先使用位运算**:如 `x*2` 替换为 `x<<1`(编译器会自动优化)。 - **避免频繁除法**:如循环中用乘法逆元替代(如 `x/3` → `x*0.333...`)。 - **关注指令集扩展**:如x86的`MUL/IMUL`、ARM的`SMULL`等专用指令。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值