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.

lunes, junio 11, 2012

Algoritmos de Cruce y Mutación


Hace un tiempo subí un video de mi implementación de Algoritmos Genéticos para resolver el problema del viajante. Unos días más tarde subí un segundo video con la misma implementación pero mostrando cómo afecta al resultado, la cantidad de algoritmos de cruce y mutación utilizados.

Ahora subí una página donde se puede ver cómo funcionan los 6 algoritmos de cruce y los 6 algoritmos de mutación que utilicé en este desarrollo.