class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 1) return dividend;
if(divisor == -1 && dividend == Integer.MIN_VALUE){//Integer.MIN_VALUE
return Integer.MAX_VALUE;
}
if(divisor < 0 && dividend < 0){
return divide(-(long)dividend, -(long)divisor);
}
else if(dividend < 0 || divisor < 0){
return -divide(Math.abs((long)dividend), Math.abs((long)divisor));//负号必须放前面
}
else return divide((long)dividend, (long)divisor);
}
public int divide(long dividend, long divisor){
if (dividend < divisor) {
return 0;
}
int count = 1;
long sum = divisor;
while(dividend >= sum){
sum <<= 1;
count <<= 1;
}
sum >>>= 1;//对正数而言,无符号和有符号右移没有区别
count >>>= 1;//为什么是无符号右移
return count + divide(dividend - sum, divisor);
}
}
无符号右移:注意负数为整数的补码:先反码再+1