sábado, diciembre 22, 2012

Cómo saber si un número es potencia de 2 en C#

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.