public int divide(int dividend, int divisor) {
//判断符号
int symbol=(dividend>0&&divisor>0)||(dividend<0&&divisor<0)?1:-1;
//边界情况直接返回
if(dividend==Integer.MAX_VALUE&&divisor==1) return dividend;
if(dividend==Integer.MAX_VALUE&&divisor==-1) return -dividend;
if(dividend==Integer.MIN_VALUE&&divisor==1) return -dividend;
if(dividend==Integer.MIN_VALUE&&divisor==-1) return Integer.MAX_VALUE;
//放到long中避免Integer.MIN_VALUE的绝对值超过int最大值
long a=Math.abs((long)dividend),b=Math.abs((long)divisor);
//记录结果
int result=0;
int i=0;
//temp用于保存最初始的b
long temp=b;
//当a恰好是2^n,b=2的时候是存在a=temp的,所以需要加上a==temp的情况
while(a>=b){
//左移,相当于b*2
b=b<<1;
//a<b情况说明到达临界点了
if(a<b){
//计算result的值 2<<(i-1)等价与Math.pow(2,i),如果是i=0的情况说明Math.pow(2,0)就是1
result=result+(i>0?2<<(i-1):1);
//获取差值
a=a-(b>>1);
//重新开始计算
b=temp;
i=0;
}else{
//累计乘2的次数
i++;
}
}
return symbol>0?result:-result;
}