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