按位与:&
两者为真(1)才为真(1),也可以理解为只要有假(0)就一定为假(0),如下:

按位或:|
只要有一个是真(1)则为真(1),否则为假(0)

按位异或:^
相同为假(0),相异为真(1),如下:

异或(^)运算规律:
对任意常数a,b,c有:
a^0=a,a^a=0,a^b^c=a^(b^c)
按位取反:~
真(1)变为假(0),假(0)变为真(1),如下:

位运算的优先级
关于位运算的优先级是一个让人很头疼的事情,不过也很好解决,直接简单粗暴多加括号就行,就像写宏定义一样。
1.确定n的第x位是0还是1
把n右移x位,然后去&1,如下:
(n>>x)&1
如果结果为0则第x位为0,如果结果为1则第x位为1。
2.把n的x位改成1
把1左移x位,然后去| n,如下:
n=(1>>x)|n 或 n|=(1>>x)
3.把n的x位改成0
把1左移x位,然后按位取反后去&n,如下:
n=(~(1>>x))&n 或 n&=(~(1>>x))
4.提取二进制最右侧的1
(~n+1)&n
5.去掉二进制最右侧的1
n&(n-1)
相关题目1:231. 2 的幂 - 力扣(LeetCode)
解题代码:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0&&(n&(n-1))==0;
}
};相关题目2:191. 位1的个数 - 力扣(LeetCode)
解题代码:
int hammingWeight(uint32_t n)
{
int t=0;
while(n)
{
n&=n-1;
t++;
}
return t;
}相关题目3:461. 汉明距离 - 力扣(LeetCode)
解题代码:
class Solution {
public:
int hammingDistance(int x, int y)
{
int z=x^y;
int sum=0;
for(int i=0;i<32;i++)
if((z>>i)&1==1) sum++;
return sum;
}
};137. 只出现一次的数字 II - 力扣(LeetCode)

需要注意这个题用暴力方法是很好想的,但是要求使用线性的时间复杂度和常级别的空间来解决该问题。
算法思路:
解题代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int arr[32]={0};
for(int i=0;i<nums.size();i++)
{
for(int j=0;j<32;j++)
arr[j]+=1&(nums[i]>>j);
}
int m=0;
for(int i=0;i<32;i++)
{
m|=(arr[i]%3)<<i;
}
return m;
}
};面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

算法思路: 记:缺失的两个数字为ret1和ret2,初始化为0。
class Solution {
public:
vector<int> missingTwo(vector<int>& nums)
{
int k=0,n=nums.size();
for(int i=0;i<n;i++) k^=nums[i];
for(int j=1;j<=n+2;j++) k^=j;
int u=0;
while(((k>>u)&1)!=1) u++;
int ret1=0,ret2=0;
for(int j=0;j<n;j++)
{
if(((nums[j]>>u)&1)==1) ret1^=nums[j];
else ret2^=nums[j];
}
for(int j=1;j<=n+2;j++)
{
if((j>>u)&1==1) ret1^=j;
else ret2^=j;
}
return {ret1,ret2};
}
};