Integer.MIN_VALUE разделить на -1

почему эта строка кода имеет значение?(я получаю неправильный ответ без него)

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

Вопрос:

Разделите два целых числа без использования умножения, деления и оператора мод.

Если это переполнение, верните 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;
}

2 ответа

Решение

Ява использует 32 бита для хранения int,

Максимальное значение int составляет 231-1

0111 1111 1111 1111 1111 1111 1111 1111

Минимальное значение int составляет -231

1000 0000 0000 0000 0000 0000 0000 0000

Другими словами, int не имеет достаточно большого значения для хранения 231(-Integer.MIN_VALUE).

Потому что абсолютные значения Integer.MAX_VALUE а также Integer.MIN_VALUE не равны

  • Integer.MAX_VALUE является 2147483647
  • Integer.MIN_VALUE является -2147483648

В случае, если вы разделите Integer.MIN_VALUE от -1, значение будет переполнено (2147483648 > 2147483647), таким образом, должен быть предел для этой операции.

Другие вопросы по тегам