给定两个正整数x和y,请检查是否通过旋转另一个整数来获得一个整数。
Input constraint: 0 < x, y < 2^32
位旋转:旋转(或循环移位)是与移位类似的操作,不同之处在于,一端掉落的位放回另一端。
有关位旋转的更多信息,请参见此处
范例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
范例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
由于x,y> 0且x,y <2 ^ 32,因此可以表示x或y的总位数为32。
因此,我们需要找到x的所有32种可能的旋转并将其与y进行比较,直到x和y不相等。
为此,我们使用64位临时变量x64,这是x与x串联的结果。
x64的前32位与x的位相同,后32位也与x64的位相同。
然后,我们继续在右侧将x64移位1,并将x64最右边的32位与y进行比较。
这样,由于旋转,我们将能够获得所有可能的位组合。
这是上述算法的实现。
C++
// C++ program to check if two numbers are bit rotations
// of each other.
#include
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;
}
Java
// Java program to check if two numbers are bit rotations
// of each other.
class GFG {
// function to check if two numbers are equal
// after bit rotation
static boolean isRotation(long x, long y) {
// x64 has concatenation of x with itself.
long 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
public static void main(String[] args) {
long x = 122;
long y = 2147483678L;
if (isRotation(x, y) == false) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to check if two
# numbers are bit rotations of each other.
# function to check if two numbers
# are equal after bit rotation
def isRotation(x, y) :
# x64 has concatenation of x
# with itself.
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
if __name__ == "__main__" :
x = 122
y = 2147483678
if (isRotation(x, y) == False) :
print("yes")
else :
print("no")
# This code is contributed by Ryuga
C#
// C# program to check if two numbers
// are bit rotations of each other.
using System;
class GFG
{
// function to check if two numbers
// are equal after bit rotation
static bool isRotation(long x, long y)
{
// x64 has concatenation of
// x with itself.
long 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
public static void Main()
{
long x = 122;
long y = 2147483678L;
if (isRotation(x, y) == false)
{
Console.Write("Yes");
}
else
{
Console.Write("No");
}
}
}
// This code is contributed
// by 29AjayKumar
PHP
= $y)
{
// comapring only last 32 bits
if (($x64) == $y)
return 1;
// right shift by 1 unit
$x64 >>= 1;
}
return -1;
}
// Driver Code
$x = 122;
$y = 2147483678;
if (isRotation($x, $y))
echo "yes" ,"\n";
else
echo "no" ,"\n";
// This code is contributed by aj_36
?>
Javascript
输出 :
yes