目录
前言
位运算是二进制的运算,利用好有些题目将实现O(1)复杂度。
&:按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |
|:按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
^:按位异或 | 若参加运算的两个二进制位值相同则为0,否则为1 |
~:取反 | ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 |
<<:左移 | 用来将一个数的各二进制位全部左移N位,右补0 |
>>:右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0 |
1.第k位数
求n的二进制第k位数字: n >> k & 1
代码体现:
# include<iostream>
using namespace std;
int main()
{
int n = 10,k;
cin>>k;
printf("%d",n>>k&1);
}
2.返回n的最后一位1
返回n的二进制最后一位1:lowbit(n) = n & -n
例题:acwing801
# include <iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int x;
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>x;
int res=0;
while(x)//直至x为0,此时不存在1
{
x -= lowbit(x);//每次减去了x的最后一位1
res++; //计数一次
}
cout<<res<<" ";
}
}