zoukankan      html  css  js  c++  java
  • Divide Two Integers

     1 int divide(int dividend, int divisor) {
     2     if(divisor==0)return INT_MAX;
     3     if(dividend==0)return 0;
     4     long long res=0;
     5     int flag=1;
     6     long long d1=dividend;
     7     long long d2=divisor;
     8     if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))flag=0;
     9        if(d1<0)d1=-d1;
    10        if(d2<0)d2=-d2;
    11        if(d2>d1)return 0;
    12        int i=0; 
    13        long long d3=d2;
    14        while(d1>=d3){
    15            d2=d3;
    16            i=0;
    17            while(d1>=d2){
    18             d1=d1-d2;
    19             if(d1>=0)res=res+(1<<i);
    20             d2<<=1;
    21             i++;
    22         }
    23     }
    24     if(flag==0)res=0-res;
    25     if(res<INT_MIN||res>INT_MAX)return INT_MAX;
    26     return res;
    27 }
    View Code

    学过计算机组成原理的都知道,在计算机内部是没有乘除的,计算机内部的算术运算只有加减,而加减又可以都当做是一种操作。计算机组成原理中介绍除法运算的时候会介绍一种较辗转相减的方法,就是将两个相除的数据取正,用大的那个循环减去小的那个,直到出现负值,并且没减一次,count++,最后的count就是结果。这种方法的局限性在与,每次都只减去一个除数,这样的话,循环的次数太多,浪费时间。我们要做的就是在每次减去除数的时候,都将它扩大一倍。举例来说:

    a/b=?

    a=100,b=2,count=0

    第一次 a-=b b<<=1 (a=98,b=4,count+=1)

    第二次 a-=b b<<=1 (a=94,b=8,count+=2)

    第三次a-=b b<<=1 (a=78,b=16,count+=4)

    ...

    ...

    第一次count只加1的原因是,只减去一个b

    第二次count加2的原因是,减去了2个b

    第三次,则是减去了4个b

    特别注意的是上面的循环只是一次的循环,b每次扩大2倍,总会大于a,只要跳出循环,参数重置,再次进行循环知道a小于初始的b即可。

  • 相关阅读:
    Linux内核将要支持最新龙芯3A2000/3B2000
    微软拥抱Linux,着实太晚了
    武校学生
    第一篇 SCI 综述被接收的感想
    如何使用Rally+Docker测试OpenStack
    (OK) ntp——linux设置系统时间—RHEL—FEDORA—CENTOS
    理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术
    (OK) find-alter-files.sh——递归
    (OK) digui-gb18030-utf8.sh——递归
    (OK) digui-dir-del-M.sh——递归
  • 原文地址:https://www.cnblogs.com/lichao-normal/p/6105518.html
Copyright © 2011-2022 走看看