除法

任何数都可以表示表示成二进制,假设商是q,则q可以表示成q=2^k1 + 2^k2 + ... + 2^kn (设k1 > k2 > ... > kn) = a/b,故 a = bq=b(2^k1 + 2^k2 + ... + 2^kn)。改进试商每次让a - b<<k,直到a - b << k > 0且a - b << (k+1) < 0,此时就找到了k1。令a' = a - b <<k = a - b*2^k, 那么q’ = a'/b = ( a - b*2^k)/b = a/b - 2^k = q - 2^k,故q = q' + 2^k。重复以上过程即可找到k2, k3, ... kn,最终算出q。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int divide( int dividend, int divisor)
{
     bool negative = ((dividend ^ divisor) >> 31) & 0x1 == 1;
     unsigned int a = dividend < 0 ? -dividend : dividend;
     unsigned int b = divisor < 0 ? -divisor : divisor;
     unsigned int quotient = 0;
 
     while (a >= b)
     {
         unsigned int k = 0;
         for (; a >= b << k && b << k <= (0x80000000 >> 1); ++k);
         quotient |= 1 << (a < b << k ? --k : k);
         a -= b << k;
     }
 
     return negative ? 0-quotient : quotient > INT_MAX ? INT_MAX : quotient;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值