一、基本位运算
A&B
同为1才是1。
通常用于二进制位操作,如一个数&1的结果就是取二进制的最末尾,可以用来判断整数奇偶。
A|B
有一个是1才是1。
通常用于二进制定位上的无条件赋值,例如一个数or1的结果就是把二进制最末位强行变成1,若要变成0则减1就可以了,实际意义就是把这个数强行变成最接近的偶数。
A^B
两数不同才是1。
通常用于对二进制的特定一位进行取反,可以对两个数进行交换。
常用性质:A^B^B=A,即B^B=0,可以用作判断一个数出现的次数,0^A=A,并且可以用作字符串的比较。
~运算
把二进制所有数取反。
取反,注意的是整数类型有没有符号,如果是无符号整数,那么得到的值为其与上界的差。
位运算简单应用
二、简单的二进制枚举
核心思想:利用二进制的1,和0代表选择与不选择。将所有情况罗列开,并一位一位与各种情况进行对比,例如:
for(i=0;i<(1<<n);i++)//n是指集合中的元素的个数,(1<<n)==2^n指的是总共的情况数目
{
for(j=0;j<n;j++)//j代表的是每种元素对应的下角标
{
if(i&(1<<j))//代表选择
{
}
else(i&(1<<j)==0)//代表不选择;
}
if( )//加入题目所给出的条件;
{
}
}
三、用异或比较不同(计算机中异或的操作是对于整型的操作,double不可以)
1.比较数的异或。
//此题是找出所有数中数字只出现一次的数
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int n;
while(cin >> n) //共有n个数
{
long long ans=0;
int x; //x是要输入的数
for(int i=1;i<=n;i++)
{
cin >> x;
ans=ans^x; //A^A=0,0^A=A,并且异或具有交换律
}
cout << ans << endl;
}
return 0;
}
2.比较字符串的异或。
例题:NEFU teacher Li
#include<bits/stdc++.h>
using namespace std;
int n, tot=0;
string start, follow;
int main()
{
while(cin>>n)
{
cin>>start;
for(int i=1; i<n*2-1; i++)
{
cin>>follow;
for(int j=0; j<max(start.size(), follow.size()); j++)
start[j] ^= follow[j];
}
cout<<"Scenario #"<<++tot<<endl<<start<<endl<<endl;
}
return 0;
}
典型例题:
NEFU 1205 和为K--二进制枚举 NEFU 1505 陈老师加油-二进制枚举 NEFU 1652 中美合拍