Función para saber si un número es potencia de dos:
Uso de And Lógico
Voy a explicaros la siguiente función, que nos devuelve si un número dado es una potencia del número 2 o no.
[JAVASCRIPT]
b2Math.b2IsPowerOfTwo = function(x)
{
var result = x > 0 && (x & (x - 1)) == 0;
return result;
};
[GAMBAS3]
Private Function function_2(x As Integer) As boolean
Dim result As boolean = false
If (x > 0) And ((x And (x - 1)) = 0) Then result = 1
Return result
End
Esta función hace lo siguiente:
1) Le pasamos un "x" que es un número integer
2) Hacemos dos comprobaciones: Si...... Y ... entonces
2.1)(x > 0): Si x es mayor que 0
2.2) ((x And (x - 1)) = 0): Si x y (x-1) es igual a 0Esta segunda parte de la expresión que se debe de comprobar es muy interesante, ya que esta trabajando con la tabla lógica de AND y el valor de los número en formato Binario.
Lo explico mejor con un ejemplo:
1) Funcion_2(8)
Vamos a comprobar si el nº 8 es una potencia de 2.
Para ello la 1º condición (2.1) se cumple (es mayor que cero),
Para la segunda condición (2.2) hacemos lo siguiente:
a) x: El número 8 es en binario: 1000
b) x-1: El número 8-1 que es 7 en binario es 0111
Hacemos la comprobación AND con los dos número
Como 0 es igual a 0, entonces le cumple.
Por lo tanto, el resultado de la función pasando le el parámetro 8, es verdadero, y el número es una potencia de dos.
1) Funcion_2(6)
Vamos a hacer la comprobación con el número 6
Para ello la 1º condición (2.1) se cumple (es mayor que cero),
Para la segunda condición (2.2) hacemos lo siguiente:
a) x: El número 6 es en binario: 110
b) x-1: El número 6-1 que es 5 en binario es 101
Hacemos la comprobación AND con los dos número
Como 4 no es igual a 0, entonces no se cumple.Por lo tanto la función devuelve FALSE, indicando que ese número (el 6) no es potencia de 2.
Anexo:
Tabla lógica de AND
Tabla lógica de AND |
Nota:
03/04/2016: Gracias a Shell por avisar de un fallo en el artículo. Ya esta corregido