Programa Javascript para verificar si dos números son rotaciones de bits entre sí o no

Dados dos enteros positivos x e y (0 < x, y < 2^32), comprueba si un entero se obtiene rotando los bits del otro. 

Rotación de bits : una rotación (o cambio circular) es una operación similar a un cambio, excepto que los bits que caen en un extremo se vuelven a colocar en el otro extremo.

Ejemplos: 

Entrada : a = 8, b = 1
Salida : sí
Explicación: Representación de a = 8: 0000 0000 0000 0000 0000 0000 0000 1000, Representación de b = 1: 0000 0000 0000, 0000 0000 0000 0000 0001. Si rotamos a por 3 unidades correctas obtenemos b, por lo tanto, la respuesta es sí.

Input : a = 122, b = 2147483678
Output : yes
Explanation : Representation of a = 122 : 0000 0000 0000 0000 0000 0000 0111 1010,Representation of b = 2147483678 : 1000 0000 0000 0000 0000 0000 0001 1110, If we rotate a by 2 unidades correctas obtenemos b, por lo tanto, la respuesta es sí.

Acercarse:

  • Dado que el total de bits en los que se puede representar x o y es 32, ya que x, y > 0 y x, y < 2^32. 
  • Entonces necesitamos encontrar las 32 rotaciones posibles de x y compararlas con y hasta que x e y no sean iguales. 
  • Para ello usamos una variable temporal x64 con 64 bits, que es resultado de la concatenación de x a x ie. x64 tiene los primeros 32 bits iguales a los bits de x y los últimos 32 bits también son iguales a los bits de x64.
  • Luego seguimos cambiando x64 por 1 en el lado derecho y comparamos los 32 bits más a la derecha de x64 con y. 
  • De esta forma, podremos obtener todas las combinaciones de bits posibles debido a la rotación.

Aquí está la implementación del algoritmo anterior.

Javascript

<script>
 
// javascript program to check if two numbers are bit rotations
// of each other.
 
// function to check if two numbers are equal
// after bit rotation
function isRotation(x, y)
{
 
    // x64 has concatenation of x with itself.
    var x64 = x | (x << 32);
    while (x64 >= y)
    {
     
        // comapring only last 32 bits
        if (x64 == y) {
            return true;
        }
 
        // right shift by 1 unit
        x64 >>= 1;
    }
    return false;
}
 
// driver code to test above function
var x = 122;
var y = 2147483678;
 
if (isRotation(x, y) == false) {
    document.write("Yes");
} else {
    document.write("No");
}
 
// This code is contributed by 29AjayKumar
</script>

Producción:  

yes

Complejidad de tiempo: O(log 2 n), donde n es el número dado
Espacio auxiliar: O(1)

¡Consulte el artículo completo sobre Comprobar si dos números son rotaciones de bits entre sí o no para obtener más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *