Sin importar el lenguaje de programación, cuando se requiere saber si un número es par o impar sin el operador de módulo, usamos la operación AND &
a nivel de bits y comparamos el resultado con 0.
En este post te voy a explicar cómo es que funciona y por qué es confiable.
Explicación
Vamos a hacer un AND de los números usando el operador &
, a nivel binario. Recuerda que AND devuelve 1 (o verdadero, true, etcétera) solo si los dos bits son 1, y 0 en cualquier otro caso.
Solo como recordatorio:
- 0 AND 0 es 0
- 0 AND 1 es 0
- 1 AND 0 es 0
- 1 AND 1 es 1
Entonces vamos a hacer la operación AND del número que vamos a probar, junto con el número 1. Así:
número & 1
Y luego vamos a comparar si el resultado de la operación es 0. En caso de que sea 0, el número es par. Ahora te explicaré la razón.
Ejemplo con números
Vamos con el número 4 que sabemos es par, y en binario es:
100
Fíjate en que su bit final (el que, si lo convertimos a decimal, valdría 1) está en 0.
Si el número es par, va a tener el último bit en 0. Si no, en 1.
Nota: aquí me refiero a “último bit” como el LSB, y no me estoy metiendo con cosas de big endian y little endian.
Cuando hacemos un AND entre el 4 y el 1 la operación binaria queda así:
100
001
___
000
Así que el resultado es 0. Si ahora probamos con el número 5
que tiene el LSB en 1 y en binario es:
101
Al hacer la operación AND:
101
001
___
001
El resultado es 1. Como es 1, se dice que no es par. Y efectivamente, el número 5 no es par.
Otros ejemplos
Hasta ahora lo hicimos con números pequeños, pero no importa cuál número sea, ya que solo nos importa el último bit. Aquí un ejemplo con la cifra de un millón que sabemos sí es par:
11110100001001000000
00000000000000000001
____________________
00000000000000000000
Aquí otro con el número FFFFFF
que es 16777215
, mismo que es impar:
111111111111111111111111
000000000000000000000001
________________________
000000000000000000000001
Y así podemos hacer para varios números. Lo bueno es que no tenemos que convertirlos a binario, pues con el solo hecho de usar el operador &
ya se está haciendo la operación a nivel binario.
Recuerda que ya he implementado esto en C y Python, aunque se puede hacer en cualquier otro lenguaje que soporte esas operaciones.