# Check if two numbers are bit rotations of each other or not

Given two positive integers x and y, check if one integer is obtained by rotating bits of other.

`Input constraint: 0 < x, y < 2^32 `

Bit Rotation: A rotation (or circular shift) is an operation similar to shift except that the bits that fall off at one end are put back to the other end.

Example 1 :

```Input : a = 8, b = 1
Output : yes

Explanation :
Represntation of a = 8 : 0000 0000 0000 0000 0000 0000 0000 1000
Represntation of b = 1 : 0000 0000 0000 0000 0000 0000 0000 0001
If we rotate a by 3 units right we get b, hence answer is yes
```

Example 2 :

```Input : a = 122, b = 2147483678
Output : yes

Explanation :
Represntation of a = 122        : 0000 0000 0000 0000 0000 0000 0111 1010
Represntation of b = 2147483678 : 1000 0000 0000 0000 0000 0000 0001 1110
If we rotate a by 2 units right we get b, hence answer is yes
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Since total bits in which x or y can be represented is 32 since x, y > 0 and x, y < 2^32. So we need to find all 32 possible rotations of x and compare it with y till x and y are not equal. To do this we use a temporary variable x64 with 64 bits which is result of concatenation of x to x ie.. x64 has first 32 bits same as bits of x and last 32 bits are also same as bits of x64. Then we keep on shifting x64 by 1 on right side and compare the rightmost 32 bits of x64 with y. In this way we'll be able to get all the possible bits combination due to rotation. Here is C++ implementation of above algorithm.

```// C++ program to check if two numbers are bit rotations
// of each other.
#include <iostream>
using namespace std;

// function to check if  two numbers are equal
// after bit rotation
bool isRotation(unsigned int x, unsigned int y)
{
// x64 has concatenation of x with itself.
unsigned long long int x64 = x | ((unsigned long long int)x << 32);

while (x64 >= y)
{
// comapring only last 32 bits
if (unsigned(x64) == y)
return true;

// right shift by 1 unit
x64 >>= 1;
}
return false;
}

// driver code to test above function
int main()
{
unsigned int x = 122;
unsigned int y = 2147483678;

if (isRotation(x, y))
cout << "yes" << endl;
else
cout << "no" << endl;

return 0;
}
```

Output:

```yes
```

This article is contributed by Pratik Chhajer. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

# GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
2.8 Average Difficulty : 2.8/5.0
Based on 13 vote(s)