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; }