51nod自学日记-位运算应用

引入

今天,我有时间,在51nod上学习了位运算应用。

一、<< 的应用

左移 \(1\) 位相当于该数乘以 \(2^1\) ,左移 \(2\) 位相当于该数乘以 \(2^2\)
\(15<<2 = 60\),即乘了 \(2^2\) 。但此结论只适用于该数左移时被溢出舍弃的高位中不包含 \(1\) 的情况。

二、<< 的应用

右移一位相当于除以 \(2\) ,右移 \(n\) 位相当于除以 \(2^n\)
在右移时,需要注意符号位问题。对无符号数,右移时左边高位移入 \(0\) 。对于有符号的值,如果原来符号位为 \(0\) (该数为正),则左边也是移入 %0% ,如果上例表示的那样,如果符号位原来为 \(1\)(该数为负),则左边移入的 \(0\) 还是 \(1\) ,要取决于所用的计算机系统。移入 \(0\) 称为 逻辑右移,即简单右移。移入 \(1\) 称为算术右移

三、常用位运算的技巧

式子 用途
\(n \& (n-1) == 0\) 判断一个数是否为 \(2\) 的幂
\(n \& (-n)\) (lowbit)获得一个数二进制的最后一个为\(1\)\(bit\)
\(n \& ((1<<x)-1)\) \(n\) \(mod(\%)\) \(2^x\)
\((x xor y)>=0\) 判断两个数符号是否相同
(n & (n - 1) == 0) && (n % 3 == 1) 判断一个数是否为\(4\) 的幂

四、51NOD同步学-位运算运用

3047 位移运算
\(\color{red}本题目代码来源于51NOD标程\)
\(\color{red}┭┮﹏┭┮我的头盾\)

#include<bits/stdc++.h>
using namespace std;

bool check(int x, int y)
{
    while (y != 0 && y % 2 == 0)
        y /= 2;

    while (x > 0) 
	{
        if ((x & y) == y)
        {
            int v = x ^ y;
            int lowbit = (v & (-v));
            if (v == 0 || lowbit > y)
                return true;
        }

        x >>= 1;
    }

    return false;
}

int main()
{
    int t, x, y;
    cin >> t;

    for (int i = 0; i < t; i++)
	{
        cin >> x >> y;
        cout << (check(x, y) ? "Yes" : "No") << endl;
    }
}
posted @ 2026-01-08 21:10  jtbg  阅读(0)  评论(0)    收藏  举报