Ответ 1
Возможно, потому что (i % 2) != 0
работает как для положительных, так и для отрицательных чисел
Следующий фрагмент кода не проверяет правильность нечетности:
public static boolean isOdd(int i) {
return i % 2 == 1;
}
Я прочитал в Интернете, что должен сделать это следующим образом:
public static boolean isOdd(int i) {
return i % 2 != 0;
}
Почему это?
Возможно, потому что (i % 2) != 0
работает как для положительных, так и для отрицательных чисел
Потому что, когда i
отрицательный → (-1) % 2 == -1
Вы должны использовать:
(i & 1) != 0
чтобы избежать проблем с символами.
Также обратите внимание, что использование &
гарантирует, что, несмотря на глупость компилятора, он будет никогда пытаться использовать деление для выполнения операции %
.
Первый фрагмент будет работать корректно, если оператор modulo должен быть заменен поразрядным и оператором:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
Это связано с тем, как modulo работает на Java. Если я отрицательный, ответ будет отрицательным. Каждый отрицательный вход возвращает false.