簡體   English   中英

Integer.MIN_VALUE除以-1

[英]Integer.MIN_VALUE divide by -1

為什么這行代碼很重要?(沒有它我會得到一個錯誤的答案)

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

問題:

在不使用乘法,除法和mod運算符的情況下除以兩個整數。

如果溢出,則返回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;
}

因為, Integer.MAX_VALUEInteger.MIN_VALUE的絕對值不相等。

  • Integer.MAX_VALUE2147483647
  • Integer.MIN_VALUE-2147483648

如果將Integer.MIN_VALUE除以-1 ,則該值將溢出( 2147483648 > 2147483647 ),因此必須對此操作進行限制。

Java使用32位來存儲int

max int值為2 31 -1

0111 1111 1111 1111 1111 1111 1111 1111

min int值為-2 31

1000 0000 0000 0000 0000 0000 0000 0000

換句話說,int沒有足夠大的值來存儲2 31-Integer.MIN_VALUE )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM