位操作练习
题目 位操作练习
思路分析
若两个数能够通过移位转换(循环左移),则二者都能转换成对方。因此,可以将问题简化成只考虑一方。
若 A能够通过移位转换成 B,则说明将 A前面某个连续部分拼接到 A后面就转化成了 B
因此,可以将 A扩充成两倍长度,此时若二者能够移位转换,则 A中必然包含有等于 B的子串。(也可以把B扩充两倍 在B里找A 都一样)
代码实现
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
while(cin>>a>>b)
{
string x,y;
//将a和b每位取出放在string里面
//从高位开始才能保持原序 因为最多16位 右移15次就可取到最高位
for(int i=15;i>=0;i--){
x.push_back(a>>i&1);
y.push_back(b>>i&1);
}
//类似于病毒匹配DNA问题 环状的
//直接拷贝一份接在原序列的结尾 形成环状
//那么就可以使用find函数进行查找了
x+=x;
// y+=y;
//if(y.find(x)!=-1)
if(x.find(y)!=-1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
💬 评论