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;
}
}
本文来自博客园,作者:jtbg,转载请注明原文链接:https://www.cnblogs.com/jtbg/articles/19458655
博客最新公告
浙公网安备 33010602011771号