`
xinklabi
  • 浏览: 1588156 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

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

阅读更多

http://blog.csdn.net/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
分享到:
评论

相关推荐

    FPGA 二进制小数的乘法和除法

    在FPGA设计中,二进制小数的乘法和除法是常见且重要的运算...总之,理解和掌握二进制小数的乘法和除法对于在FPGA上实现高效、精确的数字运算至关重要。通过巧妙的设计和算法优化,可以实现满足各种需求的数字处理系统。

    二进制运算及转换PPT课件.pptx

    二进制加法的规则是:0+0=0、0+1=1、1+0=1、1+1=10,进位为1。二进制减法的规则是:0-0=0、1-0=1、1-1=0、10-1=1。二进制乘法的规则是:0×0=0、1×0=0、0×1=0、1×1=1。二进制除法的规则是:0÷1=0、1÷1=1。 二...

    计算机基础二进制教案

    2. **二进制数的运算**:包括加法、减法、乘法和除法,以及逻辑运算如AND(与)、OR(或)、NOT(非)和XOR(异或)。这些运算在计算机硬件和软件中广泛使用。 3. **二进制与十六进制的转换**:由于十六进制能更...

    二进制及十进制数间的转换、二进制数的四则运算.doc

    二进制数与十进制数之间的转换是计算机科学中的基础概念,对于理解数字系统的工作原理至关重要。在计算机内部,所有数据和指令都是以二进制形式存储和处理的,而我们日常生活中使用的则是十进制数系统。下面将详细...

    二进制到十六进制转换法加各种进制的运算

    1. **除法**:将十六进制数转换为十进制数后进行除法运算,然后再将结果转换回十六进制。 **示例**: 根据题目中的部分内容:“6F / 3A”的计算过程如下: 1. **转换为十进制**:6F = 6 * 16^1 + 15 * 16^0 = 102...

    《有趣的二进制》附书源码

    例如,二进制加法遵循“逢二进一”的原则,类似于十进制的逢十进一。二进制乘法则可以通过逐位乘以2的幂次来完成。对于二进制减法,如果不够减,需要向高位借位,而二进制除法则较为复杂,通常通过移位和减法来实现...

    这是一些关于二进制的计算

    二进制计算是计算机科学的基础,它涉及到数字的表示、运算和转换。在这个课件中,我们可以看到一系列的二进制逻辑运算和算术运算题目,这对于理解和掌握二进制计算至关重要。 首先,我们来看看逻辑运算。逻辑运算...

    网络资料二进制加法机

    在构建计算机系统时,理解和掌握二进制加法至关重要,因为所有的算术运算,包括减法、乘法、除法以及其他复杂的计算,都可以通过基本的加法操作来实现。二进制加法机虽然在效率和功能上无法与现代计算机相比,但它...

    简单的进制转换的讲解

    例如,二进制加法1101 + 1011的结果是10000,二进制乘法11 * 11的结果是1001。 进制转换的方法包括直接转换和部分转换。例如,要将十进制数转换为二进制,可以使用“除二取余”法,即将十进制数连续除以2,每次得到...

    二进制转换算法.doc

    例如:加法、减法、乘法、除法等运算规则。 二、进制转换 1. 二进制与十进制数间的转换 二进制数可以转换为十进制数,反之亦然。将每个二进制数按权展开后求和即可。例如,将二进制数(101.101)2 转换为十进制数...

    java二进制运算器(加、见、乘、除)

    2. **二进制加法**: 在二进制中,加法遵循简单的规则:0+0=0,0+1=1,1+0=1,1+1=10(进位)。在Java中,可以使用整型变量存储二进制数,然后通过普通的加法操作符"+"来执行加法,但需要注意处理进位的情况。 3. **...

    二进制数和十进制数相互转换 汇编课程设计

    反之,将十进制转换为二进制则常用的方法有短除法或扩展的二进制除法。 在汇编语言中实现这种转换需要编写一系列指令来执行这些计算。"convert.asm"文件很可能是这个转换程序的源代码。汇编语言程序由指令组成,每...

    C++ 二进制运算

    移位运算在位操作、数值计算(如乘法和除法的快速实现)、数据压缩算法等领域有着广泛的应用。 ### 实例应用 让我们通过一个具体的实例来演示如何在C++中使用这些二进制运算符: ```cpp #include int main() { ...

    计算机中的数制及其转换

    二进制加法和乘法表是学习计算机基础时必须要掌握的内容。 将十进制数转换为二进制数,通常使用的方法是除2取余法。例如,一个十进制数被2整除,得到的余数按顺序排列就是对应的二进制数。相反,将二进制数转换为十...

    网页版科学计算器 二进制计算器 在线十六进制计算器.zip

    1. 二进制加法、减法、乘法和除法。 2. 二进制与、或、非、异或逻辑运算。 3. 二进制到十进制、八进制、十六进制的转换,反之亦然。 4. 左移、右移操作,模拟位移运算。 在线十六进制计算器则专注于十六进制数的...

    二进制计算.docx

    综上所述,二进制计算是理解计算机科学和信息技术的关键,无论是计算、数据表示还是硬件设计,都离不开二进制这个基本的计算单位。通过掌握二进制计算,我们可以更好地理解计算机的工作原理和编程语言的底层机制。

    计算机组成头歌计算机数据表示实验1-9关全部满分代码

    8. **运算符优先级**:在编程中,了解运算符的优先级对于正确计算至关重要,例如括号具有最高优先级,然后是乘法和除法,接着是加法和减法。 9. **位操作**:包括位移(左移和右移)、按位与、按位或、按位异或等,...

    二进制转换算法.pdf

    - **乘法**和**除法**:同样遵循简单的规则,例如1*1=1,其他情况结果为0。 3. **二进制与十进制之间的转换** - **二进制转十进制**:对每个二进制位按照它的权重(2的幂次)进行求和。例如,二进制数1011转换为...

    易语言汇编实现转换到十进制源码

    转换二进制、八进制或十六进制数字到十进制是一项基础的计算任务,对于计算机来说,所有的数据都是以二进制形式存储的。在易语言中,实现这个转换通常涉及以下几个步骤: 1. **解析输入**:首先,程序需要读取输入...

Global site tag (gtag.js) - Google Analytics