我们先来介绍位运算符的一些知识:
1.位运算符
(1).& 有0就是0
(2).有1就是1
(3).^相同为0,不同为1
2.判断第x为是0还是1
先将1<<x,在n&1,如果结果为0则是0,否则是1.
3.将第n位修改为1
1<<x,然后1|x;
4.将第x位修改为0
1<<x,然后1&x
5.位图的思想
就是利用哈希表来解决一些问题。
6.提取最右侧的1
n&(-n)
7.去掉最右侧的1
n&(n-1)
8.优先级
能加括号就加括号
9^运算率
a^0=a;
a^a=0;
(a^b)^c=a^(b^c);
我们来看几道例题:

class Solutionpublic:bool isUnique(string astr)
// 利用鸽巢原理来做的优化if(astr.size() > 26) return false;
1213
int bitMap = 0;for(auto ch : astr)
inti=ch-'a';//先判断字符是否已经出现过if(((bitMap >> i) & 1) == 1) return false;
return true;
};
利用位运算实现两个整数的和



#include<iostream>
#include<string>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
while (b != 0) {
int x;
x = a ^ b;
b = (a & b) << 1;
a = x;
}
cout << a << endl;
return 0;
}


class Solution {
public:
int missingNumber(vector<int>& nums) {
int ret=0;
for(auto e: nums){
ret=ret^e;
}
int n=nums.size();
for(int i=0;i<=n;i++){
ret^=i;
}
return ret;
}
};