Par o impar en C con operación AND a nivel de bits

Número par o impar sin usar divisiones ni operador módulo en C

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.

Par o impar en C con operación AND a nivel de bits
Par o impar en C con operación AND a nivel de bits

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “Número par o impar sin usar divisiones ni operador módulo en C”

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

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *