位运算平时用的少,所以每次都是用了忘记,忘记就百度,这次借补CF golbal的机会来写一个总结。(写快速幂时会运用位运算也可以加快算法效率).
1与运算&。1&1=1其他情况皆为0.比如7的二进制111,6的二进制110,6&7=6.5二进制101,3的二进制为11 5&3=1.
2或运算| 两个位都为0时,结果才为0,其余结果皆为1.(与&运算完全相反)。
3异或^,两个位相同为0,不同时为1。如7^6=1.
4取反~,0变1,1变0.
5左移<< 二进位全部左移若干位,高位丢弃,低位补0.比如左移2位就是<<2
6右移>> 二进位全部右移若干位,对无符号数,高位补0.右移两位就是>>2.
位运算用途
1 &与运算
清0:将数与0进行与运算.
取二进制数的后几位:类似与十进制取模,当想取二进制后x位时,只需将该数与111...(一共x个1)进行位运算即可。
判断奇偶性:二进制的最后一位数控制该数的奇偶性。
2 |或运算
与&运算类似。
3.异或^
可以理解为不进位的二进制加法。
1.可以判断奇偶性。将数a与1异或运算,奇数答案为0,偶数答案为1.
2.不引入第三个变量就可以交换两个变量的值。

a=a^b;
b=b^a;
a=a^b;

判断两个值是否相等

a^b==0 => a==b;

4.左移<<
左移一位乘2,左移二位乘4,依次类推。
比如a=1011,a<<1,a=10110
5.右移,右移一位相当于除以2。
注意右移几位时最后几位要舍去。
————————————————
版权声明:本文为CSDN博主「yyx20200227」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yyx20200227/article/details/106469994
先把题目链接放出来:https://codeforces.com/contest/1491/problem/D

#include <iostream>
#include<stdio.h>
#include <cstring>
#include <algorithm>
#include <string.h>
#include <queue>
//#include <bits/stdc++.h>
#define pb push_back
#define qc std::ios::sync_with_stdio(0);
#define maxn 0x3f3f3f
#define debug(x) cout<<"debug"<<x<<endl;
using namespace std;
const int max_n=35;
const int min_n=10000000;
typedef long long ll;
typedef unsigned long long int ul;
typedef double dl;
bool check(int u,int v)
{
    int cntu=0,cntv=0;
    for(int i=1;i<=30;i++) //int 范围为2^31-1
    {
        if(u&1==1) cntu++;//如果u二进制的最后一位是1,cntu++; 
        u=u>>1;
        if(v&1==1) cntv++;//同理 
        v=v>>1;
        if(cntv>0)
        {
            if(cntu==0) return 0;
            cntu--;cntv--; 
        }
    }
    return 1;
}
int main()
{
    int q;
    cin>>q;
    int u,v;
    while(q--)
    {
        cin>>u>>v;
        int p=u&v;
        if(v>=u)
        {
            if(check(u,v)) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
         }
        else cout<<"NO"<<endl;
    }
}