位操作练习

题目 位操作练习

image-decf50ed

思路分析

若两个数能够通过移位转换(循环左移),则二者都能转换成对方。因此,可以将问题简化成只考虑一方。

若 A能够通过移位转换成 B,则说明将 A前面某个连续部分拼接到 A后面就转化成了 B

因此,可以将 A扩充成两倍长度,此时若二者能够移位转换,则 A中必然包含有等于 B的子串。(也可以把B扩充两倍 在B里找A 都一样)

image-6ba592f9

代码实现

#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;

}

同类题型

视频讲解


⬅️ 二进制中1的个数 🏠 00-刷题理模型 ➡️ 位运算