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:
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.
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.
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.
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.
Mira aquí más tutoriales de este lenguaje.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
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