Uno de las razones de este blog es la de publicar soluciones cuando no las encuentro en Google y las desarrollo por mi cuenta.
Busqué en Google cómo determinar si un número es potencia de 2 y encontré respuestas erróneas debido a que muchos confunden potencia de 2 con elevar un número al cuadrado.
La solución en C# es extremadamente sencilla y sirve para saber si un número es potencia de cualquier número.
La explicación es que la operación inversa de la potenciación es el logaritmo (y no la raiz cuadrada). Entonces, 2 elevado a la potencia de 10 da por resultado un número cuyo logaritmo en base 2 es 10.
Con esto en mente, la solución más sencilla es sacar el logaritmo en base 2 de dicho número y verificar que el resultado es un número entero.
El código:
public bool esPotenciaDe2 (int numero)
{
return (System.Math.Log(numero, 2) % 1 == 0);
}
Para saber si el número resultante es entero simplemente obtengo el módulo 1 del mismo.
Fácilmente podemos convertir la función en una genérica agregando un nuevo parámetro:
public bool esPotenciaDeN (int numero, int esPotenciaDe)
{
return (System.Math.Log(numero, esPotenciaDe) % 1 == 0);
}
Sencillo pero no lo encontré en Google.