java - relacionales - Probando la rareza de un entero con el operador de módulo
operadores relacionales en java (5)
El siguiente fragmento de código no prueba la rareza correctamente:
public static boolean isOdd(int i) {
return i % 2 == 1;
}
Leí en la web que debería hacerlo de la siguiente manera:
public static boolean isOdd(int i) {
return i % 2 != 0;
}
¿Por qué es esto?
Deberías usar:
(i & 1) != 0
para evitar problemas de signos.
También tenga en cuenta que usar &
garantiza que, por muy estúpido que sea el compilador, nunca intentará usar una división para lograr el %
operación.
El primer fragmento funcionaría correctamente si el operador de módulo fuera reemplazado por bitwise y el operador:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
Esto tiene que ver con la forma en que funciona el módulo en Java. Si i es negativo, la respuesta también será negativa. Cada entrada negativa devolverá falso.
Podría ser porque (i % 2) != 0
funciona tanto para números positivos como negativos
Porque cuando i
es negativo -> (-1) % 2 == -1