--- title: "位操作练习" created: 2025-11-28 tags: - 算法 --- # 位操作练习 ## 题目 [位操作练习](https://www.acwing.com/problem/content/3438/) ![[image-decf50ed.png]] ## 思路分析 若两个数能够通过移位转换(循环左移),则二者都能转换成对方。因此,可以将问题简化成只考虑一方。 若 A能够通过移位转换成 B,则说明将 A前面某个连续部分拼接到 A后面就转化成了 B 因此,可以将 A扩充成两倍长度,此时若二者能够移位转换,则 A中必然包含有等于 B的子串。(也可以把B扩充两倍 在B里找A 都一样) ![[image-6ba592f9.png]] ## 代码实现 ```cpp #include 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"<