Hoy veremos un algoritmo simple pero un poco interesante; se trata de determinar si un número es par o impar pero con algunas restricciones:
- No se pueden usar divisiones
- No se debe usar el operador módulo %
Es decir, no es como estábamos acostumbrados a hacerlo con:
if(numero % 2 == 0) printf("Es par");
Lo haremos en el lenguaje de programación C, pero puedes aplicarlo para otros lenguajes.
Saber si es par o impar sin divisiones ni módulo en C
Aquí aplicamos algo que no es muy popular pero sí es poderoso. Se trata de las operaciones a nivel de bits. Recordemos que todos los números decimales tienen su representación en formato binario; el cual tiene únicamente ceros y unos.
Por ejemplo, el número 1 es 1, 2 es 10, 3 es 11, 4 es 100 y así sucesivamente. Abre el conversor de números para que vayas probando conforme lees el post.
¿Cuál es la diferencia entre los pares e impares en su representación binaria? veamos una lista.
- 50 (par) es 110010
- 51 (impar) es 110011
- 100 (par) es 1100100
- 101 (impar) es 1100101
Si te fijas, los pares terminan en 0 y los impares en 1. Con esto ya tenemos una pista; pues el último bit también llamado LSB está encendido cuando es impar, y apagado cuando es par.
Hora de recordar las operaciones lógicas; sobre todo la operación AND que es aquella que dice que regresa verdadero sólo si las dos condiciones se cumplen; y nada más.
Con eso podemos hacer una operación con el número 1 y el número que vamos a comprobar. El número 1 en binario es 1, y si probamos con el 50 que es 110010 queda así:
1 AND 110010
Empieza a comparar de la derecha a la izquierda. Toma el 0 de 50 y toma el 1 del 1; al hacer 0 AND 1
el resultado es 0.
¿y qué pasa cuando es impar? tomemos ahora el 51, queda así:
1 AND 110011
Toma el 1 del 51 (no te confundas, toma el bit de la derecha) y el 1 del 1; al hacer 1 AND 1
el resultado es 1.
Por lo tanto, concluimos que:
Un número es par cuando al hacer una operación AND a nivel de bits con el 1 regresa un 0. Y es impar cuando al hacer una operación AND a nivel de bits con el 1 regresa un 1.
Aquí puedes leer una explicación más detallada y con ejemplos.
Código para saber si es par o impar en C, utilizando operaciones a nivel de bits
Basta de charlas, veamos el código.
/*
Par o impar en C, pero sin
usar divisiones ni operador módulo
@author parzibyte
Visita: parzibyte.me
*/
#include <stdio.h>
int main() {
int numero;
printf("Escribe un número:\n");
scanf("%d", &numero);
// Operación AND a nivel de bits
// Esto devolverá un 1 o un 0; y recordemos que
// un 1 se evalúa como true y un 0 como false
int resultado = numero & 1;
if (resultado) {
printf("El número %d es impar", numero);
} else {
printf("El número %d es par", numero);
}
}
Lo importante que debemos notar es la operación AND que hacemos en donde dice:
numero & 1;
Ahí usamos el operador &
para operar los bits del número. Esa comparación devolverá un 1 o 0; y dependiendo de ello (mira esto sobre los booleanos en C) imprimirá el resultado.
El algoritmo funciona correctamente.
Más de C
Mira aquí más tutoriales de este lenguaje.
tengo una duda en este caso: 98798798798987987987987985553 en binario me da 0 LSB apagado y en el repl.it me indica que es -1 ¿Por qué?
Aún estoy aprendiendo agradecería respondieras
Puede que sea un desbordamiento de búfer o algo así por el tipo de la variable