Title

位运算

位运算

位运算符的分类

  1. 与运算(&)
  2. 或运算(|)
  3. 异或(^)不同为1,
  4. 取反(~)
  5. 左移(<<)
  6. 右移(>>)

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;
}
posted @ 2021-06-06 09:52  BeautifulWater  阅读(53)  评论(0编辑  收藏  举报