题意
在不使用乘、除、模运算的情况在进行除法运算
题解
- 每次将被除数拆分出能被除数除的最大值(是2^k形式)。
- 对应的位运算操作: 将除数左移k次直至是小于等于被除数的最大值(dividend >= divisor * 2^k)。此时这部分的商为2^k
- 例如:15/4 = 8/4 + 7/4 = 2 + 1 = 3; (4二进制为0100)
1) 第一次移动k=1位时8=1000 < 15 < 16=10000 ,商为2^1=2,被除数剩余15-8=7
2) 第二次移动k=0位时4=0100 < 7 < 8=1000 ,商为2 + 2^0 = 3,被除数剩余7-4=3
3) 3 < 4, 结束
代码
class Solution {
public:
int divide(int dividend, int divisor) {
const int MAXINT = ~(1 << 31);
bool isNeg = false;
if((dividend >> 31 ^ divisor >> 31) != 0)
isNeg = true;
long long newdivid = (long long)dividend;
long long newdivis = (long long)divisor; // avoid overflow when a num left-shift to 31th. (postive num -> negtive num)
newdivid = abs(newdivid);
newdivis = abs(newdivis);
int shift;
int result = 0;
while(newdivid >= newdivis)
{
shift = 0;
long long temp = newdivis;
while(newdivid >= (temp << 1))
{
temp <<= 1;
shift++;
}
newdivid -= temp;
result += (1<<shift);
}
if(result == (1 << 31) && divisor == -1) // overflow, int hasn't +2147483648
return MAXINT;
return isNeg ? -result : result;
}
};