A modo de ejemplo en pseudocódigo:¿Cuál es la sintaxis para MOD en java
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
A modo de ejemplo en pseudocódigo:¿Cuál es la sintaxis para MOD en java
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Para enteros no negativos, se puede utilizar el resto operador %
. Para su ejemplo exacta:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Esto se puede simplificar a una sola línea:
isEven = (a % 2) == 0;
Aquí es la representación de su pseudocódigo en código mínimo de Java;
boolean isEven = a % 2 == 0;
Ahora voy a descomponerlo 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 double equals (==) se usa para comparar valores, como un par de ints y devuelve un 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.
El operador de módulo es% (signo de porcentaje). Para comprobar la uniformidad o, en general, modulo para una potencia de 2, también puede usar & (operador y) como isEven =! (A & 1).
if (a % 2 == 0) {
} else {
}
También, mod se puede utilizar como este:
int a = 7;
b = a % 2;
b
sería igual a 1. Porque 7 % 2 = 1
.
es probable que sea un error usar operadores compuestos en un ejemplo para principiantes, y sin salida. –
Esto es probablemente cierto. – jjnguy
Una alternativa al código de @Cody:
Usando el operador de módulo:
bool isEven = (a % 2) == 0;
Creo que esto es un poco mejor que la escritura de código if/else, porque hay menos duplicación & flexibilidad sin usar . Requiere un poco más de capacidad cerebral para examinar, pero el buen nombre de isEven
compensa.
Es un operador de resto, no un operador de módulo. – EJP
Java en realidad no tiene un operador de módulo de la forma en que lo hace C. % en Java es un operador de resto. En enteros positivos, funciona exactamente igual que el 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, ¡entonces siéntete libre!
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 que o igual a cero, y menor que Y.
Al realizar la misma operación con el operador "%" o rem mantiene el signo del valor X. Si X es negativo obtienes un resultado en el rango (-Y, 0). Si X es positivo obtienes un resultado en el rango [0, Y).
A menudo esta distinción sutil no importa. Volviendo a la pregunta del código, sin embargo, hay varias formas de resolver la "igualdad".
El primer enfoque es bueno para los principiantes, porque es especialmente detallado.
// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
isEven = true
}
else
{
isEven = false
}
El segundo enfoque aprovecha mejor el idioma y conduce a un código más sucinto. (No se olvide que el operador == devuelve un booleano.)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
El tercer enfoque es aquí para completar, y utiliza el operador ternary. Aunque el operador ternario a menudo es muy útil, en este caso considero el segundo enfoque superior.
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
La cuarta y última aproximación es utilizar el conocimiento de la binary representation of integers. Si el bit menos significativo es 0, entonces el número es par. Esto se puede verificar usando bitwise-and operator (&). Si bien este enfoque es el más rápido (estás haciendo un simple enmascaramiento de bits en lugar de una división), es quizás un poco avanzado/complicado para un principiante.
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
Aquí he utilizado el bit a bit-y el operador, y representados en la forma sucinta se muestra en la opción 2. Reescritura en forma de opción de 1 (y, alternativamente, Opción de 3) se deja como un ejercicio para el lector. ;)
Espero que ayude.
Tomando la Opción 4 al extremo, boolean isEven =! (A & 1), devolviendo el opuesto de si a es un número impar donde a & 1 == 1 (verdadero). Por supuesto, ese es el tipo de truco de codificador que hace que el código sea incomprensible. ;) –
Gracias Rob. Esta confusión causa enormes dificultades para explicar a los programadores cómo implementar algoritmos con propiedades matemáticas a partir de aritmética modular. El resto NO es módulo, pero uno puede derivar rápidamente un módulo de los residuos. – Jim
descargar% de Java (REM) el funcionamiento de trabajar como MOD para valores Y positivos X negativo y, puede utilizar este método:
private int mod(int x, int y)
{
int result = x % y;
if (result < 0)
{
result += y;
}
return result;
}
o con el operador ternario (más corto, pero no es posible o menos eficiente en algunas situaciones):
private int mod(int x, int y)
{
int result = x % y;
return result < 0? result + y : result;
}
el operador resto en Java es %
y el módulo operador puede expresarse como
public int mod(int i, int j)
{
int rem = i % j;
if (j < 0 && rem > 0)
{
return rem + j;
}
if (j > 0 && rem < 0)
{
return rem + j;
}
return rem;
}
El código se ejecuta mucho más rápido sin necesidad de utilizar módulo:
public boolean isEven(int a){
return ((a & 1) == 0);
}
public boolean isOdd(int a){
return ((a & 1) == 1);
}
optimización prematura mucho? –
Esto se ve mucho más limpio que la respuesta aceptada. Esto no tiene nada que ver con la optimización prematura. Es simplemente mejor, si funciona. – AlexWien
@LluisMartinez Este es uno de los refranes más citados en la informática. La cita completa es: "Los programadores pierden enormes cantidades de tiempo pensando o preocupándose por la velocidad de las partes no críticas de sus programas, y estos intentos de eficiencia realmente tienen un fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Debemos olvidarnos de los pequeños eficiencias, digamos aproximadamente el 97% del tiempo: la optimización prematura es la raíz de todo mal. Sin embargo, no debemos dejar pasar nuestras oportunidades en ese crítico 3% ". Lo que realmente significa algo bastante diferente. – EJP
usted debe examinar la especificación antes de usar 'resto' % del operador:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
num %= 10;
if(num == 1)
return false;
else if(num == 0)
return true;
else
return isEven(num + 2);
}
isEven = isEven(a);
Si bien es posible hacer una Módulo adecuado al comprobar si el valor es negativo y corregirlo si lo es (de la manera que muchos han sugerido), existe una solución más compacta.
(a % b + b) % b
Esto hará primero haga el módulo, lo que limita el valor al -b -> + b gama y luego agregar b con el fin de garantizar que el valor es positivo, dejando que el próximo módulo limitarlo al 0 - > b rango.
Nota: Si b es negativo, el resultado también será negativo
Otra forma es:
boolean isEven = false;
if((a % 2) == 0)
{
isEven = true;
}
Pero forma más fácil todavía:
boolean isEven = (a % 2) == 0;
Como dijo Kuo @Steve .
En Java es el operador %
: 15.17.3. Remainder Operator %
Tenga en cuenta que también hay floorMod
en la clase java.lang.Math
que dará un resultado diferente del %
de argumentos con diferentes signos:
If/else no es necesario, simplemente use isEven = (a% 2) == 0, –
Tenga cuidado con los términos mod y modular porque n (mod m) SIEMPRE es> = 0 pero no n% m. n% m está en el rango> -m y
Jim
¿por qué se pone 'a% 2' entre paréntesis antes de evaluar' == 0'? –