29. Divide Two Integers 实现除法
29. Divide Two Integers 实现除法
除了防止溢出这个坑之外,我们还要关注的是如何递增得尽可能得快来减少运算次数
int divide(int a, int b) {
if (a == INT_MIN && b == -1) {
return INT_MAX;
} else if (a == 0) {
return 0;
} else if (b == 1) {
return a;
}
int neg=(a>>31)^(b>>31);
// 范围 -2的31次方 ~ 2的31次方-1
// 负数的范围更大,全部转成负数来处理
if (a>0) a=-a;
if (b>0) b=-b;
if (b<a) return 0;
int sub=b;
int step=1;
int res=0;
while(true) {
// 采用步长倍增的方式使得一大一小的时候能够显著减少计算次数
while(sub >= (INT_MIN/2) && a - (sub+sub) < 0) {
sub+=sub;
step<<=1;
}
a-=sub;
res+=step;
// 恢复原始步长
step=1;
sub=b;
if (a > b) {
break;
}
}
return neg ? -res : res;
}#overflow