よる-1はInteger.MIN_VALUE除算

王ゲージ:

なぜコード事項のこのライン?(私はそれなしで間違った答えを得ます)

if (dividend == Integer.MIN_VALUE && divisor == -1) {
    return Integer.MAX_VALUE;
}

質問:

乗算、除算とMOD演算子を使用せずに2つの整数を分割します。

それはオーバーフローの場合は、2147483647を返します

回答

public int divide(int dividend, int divisor) {

    if(divisor == 0){
        return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    }

    if(dividend == 0){
        return 0;
    }

    if (dividend == Integer.MIN_VALUE && divisor == -1) {
        return Integer.MAX_VALUE;
    }

    boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);


    Long up = Math.abs((long) dividend);
    Long down = Math.abs((long) divisor);

    int res = 0;

    while(up >= down){
        int shift = 0;

        while(up >= (down << shift)){
            shift++;
        }

        up -= down << (shift - 1);
        res += 1 << (shift - 1);
    }

    return isNeg ? -res : res;
}
xingbin:

Javaは店に32ビットを使用しますint

最大int型の値が2である31 -1

0111 1111 1111 1111 1111 1111 1111 1111

分int値は、-2 31

1000 0000 0000 0000 0000 0000 0000 0000

つまり、intが2保管するのに十分な大きさ値は持っていません31-Integer.MIN_VALUE)を。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223179&siteId=1
おすすめ