Como ejemplo en pseudocódigo:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
En lugar del operador de módulo, que tiene una semántica ligeramente diferente, para enteros no negativos, puede usar el operador restante%
. Para su ejemplo exacto:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Esto se puede simplificar a una línea:
isEven = (a % 2) == 0;
%
se evalúa antes==
antes de buscarlo, por lo que no estaría claro si la expresión es equivalente a(a%2)==0
oa%(2==0)
. Supongo que es menos importante en Java, donde un booleano no es lo mismo que un número enteroAquí está la representación de su pseudocódigo en código Java mínimo;
Ahora lo dividiré en sus componentes. El operador de módulo en Java es el carácter de porcentaje (%). Por lo tanto, tomar un int% int devuelve otro int. El operador de doble igual (==) se utiliza para comparar valores, como un par de entradas y devuelve un valor booleano. Esto se asigna a la variable booleana 'isEven'. Según la precedencia del operador, el módulo se evaluará antes de la comparación.
fuente
Como todos los demás ya dieron la respuesta, agregaré un poco de contexto adicional. % el operador "módulo" está realmente realizando la operación restante. La diferencia entre mod y rem es sutil, pero importante.
(-1 mod 2) normalmente daría 1. Más específicamente, dados dos enteros, X e Y, la operación (X mod Y) tiende a devolver un valor en el rango [0, Y). Dicho de otra manera, el módulo de X e Y siempre es mayor o igual que cero, y menor que Y.
Realizar la misma operación con el operador "%" o rem mantiene el signo del valor X. Si X es negativo, obtiene un resultado en el rango (-Y, 0]. Si X es positivo, obtiene un resultado en el rango [0, Y).
A menudo, esta sutil distinción no importa. Sin embargo, volviendo a su pregunta de código, hay varias formas de resolver la "uniformidad".
El primer enfoque es bueno para los principiantes, porque es especialmente detallado.
El segundo enfoque aprovecha mejor el lenguaje y conduce a un código más sucinto. (No olvide que el operador == devuelve un valor booleano).
El tercer enfoque es aquí para completar, y utiliza el operador ternario . Aunque el operador ternario suele ser muy útil, en este caso considero que el segundo enfoque es superior.
El cuarto y último enfoque es utilizar el conocimiento de la representación binaria de enteros . Si el bit menos significativo es 0, entonces el número es par. Esto puede verificarse utilizando el operador bit a bit (&). Si bien este enfoque es el más rápido (está haciendo un simple enmascaramiento de bits en lugar de una división), tal vez sea un poco avanzado / complicado para un principiante.
Aquí utilicé el operador bit a bit y lo representé en la forma sucinta que se muestra en la opción 2. Reescribirlo en la forma de la Opción 1 (y, alternativamente, la Opción 3) se deja como ejercicio para el lector. ;)
Espero que ayude.
fuente
Para que la operación% (REM) de Java funcione como MOD para valores negativos X e Y positivos, puede usar este método:
o con el operador ternario (más corto, pero no posible o menos eficiente en algunas situaciones):
fuente
Java en realidad no tiene un operador de módulo como C. % en Java es un operador restante. En enteros positivos, funciona exactamente como un módulo, pero funciona de manera diferente en enteros negativos y, a diferencia del módulo, también puede funcionar con números de coma flotante. Aún así, es raro usar% en cualquier cosa que no sean enteros positivos, así que si quieres llamarlo módulo, ¡no dudes en hacerlo!
fuente
array[x mod array.length]
acceda a un elemento en mi matriz en lugar de intentar indexar posiciones negativas.(x % y + y) % y
o comenzando en Java 8,Math.floorMod(x, y)
Si bien es posible hacer un módulo adecuado comprobando si el valor es negativo y corregirlo si lo es (como muchos han sugerido), existe una solución más compacta.
Esto primero hará el módulo, limitando el valor al rango -b -> + b y luego agregará b para asegurar que el valor sea positivo, permitiendo que el siguiente módulo lo limite al rango 0 -> b.
Nota: Si b es negativo, el resultado también será negativo.
fuente
El código se ejecuta mucho más rápido sin usar módulo:
fuente
fuente
debe examinar la especificación antes de usar el operador 'resto'%:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
fuente
En Java es el
%
operador: 15.17.3. Operador restante%Tenga en cuenta que también hay
floorMod
en lajava.lang.Math
clase que dará un resultado diferente de los%
argumentos con diferentes signos:public static int floorMod(int x, int y)
fuente
%
porque también funciona correctamente cuando el argumento también es negativo. Ninguna de las otras respuestas es realmente correcta ya que vienen con el descargo de responsabilidad de que% no es realmente módulo a menos que los argumentos sean positivos. En particular, si desea asignar cada número entero a una posición consecutiva en una matriz, entoncesarray[floorMod(i, array.length)
funciona correctamente incluso si el índicei
entra en territorio negativo. No es así con%
.Además, mod se puede usar así:
b
sería igual a 1. Porque7 % 2 = 1
.fuente
El operador restante en Java es
%
y el operador de módulo se puede expresar comofuente
Como otros han señalado, el
%
operador (resto) no es lo mismo que lamod
operación / función del módulo matemático .Para tener un método para usar la operación de módulo matemático y no preocuparnos por el signo que está delante de
x
uno, puede usar:Tal vez esta imagen ayude a entenderla mejor (tuve dificultades para entender esto primero)
fuente
int
variable en sí misma. ElfloorMod
método lo hace correctamente (pero es posible que necesite cálculos adicionales sin
es negativo).Otra forma es:
Pero la forma más fácil sigue siendo:
Como dijo @Steve Kuo.
fuente
En
Java
, la operación mod se puede realizar como tal:Nota: La operación de modificación es diferente de la operación restante . En
Java
, el resto de la operación se puede realizar como tal:fuente
Math.floorMod()
tiene:The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).
por lo tanto, no es exactamente lo mismo que el módulo matemático. Pero , hay una manera de obtener un resultado positivo, también en el Javadoc del mismo método:If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorMod
operación funciona como se esperaba. También hay valoresfloorMod
forlong
y, de lo contrario, hayBigInteger
valores más grandes.El operador del módulo es% (signo de porcentaje). Para probar la uniformidad o generalmente hacer un módulo para una potencia de 2, también puede usar & (el operador y) como isEven =! (A & 1).
fuente
Una alternativa al código de @Cody:
Usando el operador de módulo:
Creo que este es un código marginalmente mejor que escribir if / else, porque hay menos duplicación y flexibilidad no utilizada. Requiere un poco más de poder mental para examinar, pero el buen nombre de
isEven
compensa.fuente