位运算
目录
位运算
位运算符的分类
- 与运算(&)
- 或运算(|)
- 异或(^)不同为1,
- 取反(~)
- 左移(<<)
- 右移(>>)
https://www.cnblogs.com/RioTian/p/13598747.html
&🐟与运算
- 两个对应位位1才为一,其它三种情况都为0
应用
应用——判断数的奇偶性
- 要判断的数与上1
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n&1)
cout<<"奇数"<<endl;
else
cout<<"偶数"<<endl;
return 0;
}
应用——判断一个数是否为2的正整数次幂
-
若一个数为2的正整数次幂,则这个数转换二进制后,所有位置上有且只有一个1,此时若减去一个1,将会造成“一连串的崩塌”(从个位开始不断向高位借一)。
-
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if(n>0&&(n&(n-1)==0) { cout<<"YES"; } else cout<<"NO"; return 0; }
应用——lowbit—寻找数在二进制下从右到左第一个1出现的位置及代表的值(树状)
- 一般用于树状数组
int lowbit(int k)
{
return k&-k;
}
应用——用来统计一个数在二进制下1的个数
- 算法:状态压缩
- 法一:借助lowbit
#include<bits/stdc++.h>
using namespace std;
int lowbit(int k)
{
return k&-k;
}
int main()
{
int x,cnt=0;
cin>>x;
while(x)
{
x=x-lowbit(x);
cnt++;
}
cout<<cnt;
return 0;
}
- 法二:
int count(int st)//用来确定二进制中1的数量
{
int res=0;
for(int i=0;i<=n;i++) res+=st>>i&1;
return res;
}
应用——判断在二进制的情况下是否具有相邻的1(状压)
- 算法:状态压缩
bool check(int st)
{
for(int i=0;i<n;i++)
if((st>>i&1)&&(st>>i+1&1))
return false;
return true;
}