Páginas

lunes, 27 de junio de 2016

Función para saber si un número es potencia de dos: Uso de And Lógico


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(As Integer) As boolean

  Dim result As boolean = false
  
   If (> 0) And ((And (- 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)(> 0):  Si x es mayor que 0
2.2) ((And (- 1)) = 0): Si x y (x-1) es igual a 0
Esta 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



No hay comentarios:

Publicar un comentario