Bueno, primero decir que realmente el compilador cuando tu le pones a%2 lo traduce a la otra alternativa porque es menos costosa computacionalmente. Pero como funciona esta alternativa? Primero hay que pensar en numeros en base 2 (0 y 1).
Así que cualquier numero que tengamos en base 10 lo podemos pasar a base 2 y viceversa. Así que teniendo un numero en base 2 es muy facil saber si es divisible por 2, igual que si tenemos un numero en base 10 es muy facil saber si es divisible por 10.
No se hasta que punto sabras como funciona la base 2, pero como resumen digamos que va en potencias de 2, así que cada número nos indica si esa potencia de 2 pertenece al número, me explico: el 5, en base 2 es ...101, porque no es más que 2^2 + 2^0 = 5.
Entonces aquí es donde entra la pregunta, como se si un número es par? Pues muy fácil, lo único que tengo que mirar es la última potencia, que es 2^0 = 1, ya que el resto todas dan numeros pares. Así que si en mi número de base 2 si aparece la potencia 2^0 será impar, ya que tendrás una suma de numeros pares más un numero impar. En caso contrario el número sera par, ya que tendrás la suma de potencias de base 2, que son pares.
Despues de la teoria viene la práctica, para hacer esto en la práctica se hace uso del operador lógico a nivel de bits AND (en C : &) Y lo que hacemos es comparar cualquier numero con el 1, es decir
Y porque esto produce el resultado que queremos, pues muy simple, porque al hacer AND con el número 1 nos cargamos el resto de potencias de 2 y únicamente nos quedamos con la que nos interesa, 2^0. Ya que 1 en base 2 es 000...01.
Y hacemos un AND lógico entre los números, si el número con el que hacemos el AND es impar, acabara en 1 y si hacemos un AND con el 1 acabaremos con un número =/= 0. Si es el contrario acabaremos con 0.
Así que resumiendo podemos hacer una función que nos indique si un numero es par.
Que devuelve 1 si es par y 0 si no lo es.
Código C:
Ver originalint espar(int a)
{
return a & 1 ? 0 : 1;
}