2008-09-18 18 views

Respuesta

309

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; 
+72

If/else no es necesario, simplemente use isEven = (a% 2) == 0, –

+50

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

+1

¿por qué se pone 'a% 2' entre paréntesis antes de evaluar' == 0'? –

104

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.

+11

mínimo sería sin los corchetes;) – pstanton

+1

Es un operador de resto, no un operador de módulo. – EJP

1

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).

6
if (a % 2 == 0) { 
} else { 
} 
1

También, mod se puede utilizar como este:

int a = 7; 
b = a % 2; 

b sería igual a 1. Porque 7 % 2 = 1.

+0

es probable que sea un error usar operadores compuestos en un ejemplo para principiantes, y sin salida. –

+0

Esto es probablemente cierto. – jjnguy

-2

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.

+2

Es un operador de resto, no un operador de módulo. – EJP

11

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!

83

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.

+4

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. ;) –

+0

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

29

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; 
} 
3

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; 
} 
11

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); 
} 
+4

optimización prematura mucho? –

+3

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

+3

@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

11

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

1

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 .

Cuestiones relacionadas