注意dividend, divisor 为边界的情况。还有就是>>>是 unsigned shift,在判断是否为负数时使用>>>31而不是>>31
public int divide(int dividend, int divisor) {
if (divisor == 0) {
return Integer.MAX_VALUE;
}
int result = 0;
if (dividend == Integer.MIN_VALUE) {
if (divisor == -1) {
return Integer.MAX_VALUE;
}
result = 1;
dividend += Math.abs(divisor);
}
if (divisor == Integer.MIN_VALUE) {
return result;
}
int sign = ((dividend^divisor) >>> 31) == 1 ? -1 : 1;
dividend = Math.abs(dividend);
divisor = Math.abs(divisor);
int digit = 0;
while (divisor <= (dividend>>1)) { // 注意这里为了防止越界
divisor <<= 1;
digit++;
}
while (digit >= 0) {
if (dividend >= divisor) {
dividend -= divisor;
result += 1<<digit;
}
divisor >>= 1;
digit--;
}
return result*sign;
}