位运算
目录
位运算
位运算符的分类
- 与运算(&)
- 或运算(|)
- 异或(^)不同为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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号