29. Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

思路:位移很有意思

d << 1 就相当与d*2
d << 2 就相当与d*4

1 << 0 就相当于1
1 << 1 就相当于2
1 << 2 就相当与4

这里我们用一个临时变量 mul_d 存 d 的左移操作,注意: mul_d 必须为long,因为左移操作
很可能溢出!!利用了二进制每一位都是2的倍数的特点
public class Solution {
    public int divide(int dividend, int divisor) {
        if (divisor==0||(dividend==Integer.MIN_VALUE && divisor==-1))
            return Integer.MAX_VALUE;

        int i,result=0;

        long dividLong  = Math.abs((long)dividend);
        long divisLong  = Math.abs((long)divisor);

        while(dividLong>=divisLong){
            long multi_divis = divisLong;
            i = 0;
            while(dividLong>=(multi_divis<<1)){
                i++;
                multi_divis <<=1;
            }
            dividLong -= multi_divis;
            result += 1<<i;
        }

        if((dividend>0 && divisor>0) || (dividend<0 && divisor<0)){
            return result;
        }else{
            return -result;
        }
    }
}

results matching ""

    No results matching ""