模拟除法

 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;


    }

 

posted @ 2020-08-30 12:44  soft.push("zzq")  Views(166)  Comments(0Edit  收藏  举报