LeetCode 29. Divide Two Integers 注意负数的移位运算

因为负数的范围更大,所以用负数来表示商,同时特判商为-2^32的情况

用移位和减法来循环模拟除法,最多计算32次

PS:负数右移一位时

负奇数 和除以二结果不同(因为要除以二截断,但是和正数截断的方向不一致)

负偶数 和除以二结果相同

所以注意这点

class Solution {
    public int divide(int dividend, int divisor) {
        int r = (1<<30)-1;
        r = r+r+1;
        int l = -r-1;
        if(dividend == l && divisor == -1)
            return r;
        if(divisor == l)
            if(dividend == l)
                return 1;
            else
                return 0;
        int flag =1;
        if(dividend <0 && divisor >0)
            flag = 0;
        if(dividend >0 && divisor <0)
            flag = 0;
        if (dividend>0)
            dividend = -dividend;
        if(divisor>0)
            divisor = -divisor;
        int ans = 0;
        int mul = 1;
        int base = divisor;
        while((dividend/2) <= base){
            // System.out.println("dividend>>1 " + (dividend/2));
            // System.out.println("base " + base);
            base<<=1;
            mul<<=1;
        }
        
        while(dividend <= divisor && base<=divisor){
            if(dividend <= base){
                ans+=mul;
                dividend -= base;
            }
            base>>=1;
            mul>>=1;
        }
        if(flag == 0)
            return -ans;
        return ans;
    }
}

Guess you like

Origin blog.csdn.net/Dale_zero/article/details/120192681