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