任何数都可以表示表示成二进制,假设商是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;
}
|