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

计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)http blog csdn net blues1021 article details 前言 虽然我们在编程语言中可以直接使用 但是对某些要求不能用 的情况下 我们有必要了解一下计算机是怎样完成乘除法的 首先 我们要明确一下计算机所能完成的最基本操作是

大家好,我是讯享网,很高兴认识大家。

http://blog.csdn.net/blues1021/article/details/

前言

  • 虽然我们在编程语言中可以直接使用+-/,但是对某些要求不能用/的情况下,我们有必要了解一下计算机是怎样完成乘除法的。
  • 首先,我们要明确一下计算机所能完成的最基本操作是:+(-)和左移右移。虽然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。

计算机计算除法

  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)

 

 

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

除法:被分解为右移累减去,减法可以转换为加法。
小讯
上一篇 2025-03-13 10:36
下一篇 2025-01-25 16:19

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/66668.html