位运算
最近都快忘了位运算了,知道最近学习到状压dp,又想起了位运算,今天便来总结一下。
基本概念
&
与:若两个相应的二进制位都为1,则该位的计算结果为1,否则为0
|
或:若两个相应的二进制位中只要有一个为1,该位的计算结果为1
^
异或:若两个相应的二进制位不同,则该位计算结果为1, 否则该位为0.
<<
左移:将一个数的各二进制位全部左移N位,右补0,相当于乘以2^N,如(a*2=a<<1)
>>
右移:将一个数的各二进制位右移N位,相当于除以2^N,如(a/2=a>>1)
实际应用
判断数字x第i位是否为1
if(x&(1<<i))//判断数字x第i位是否为1
将一个数字x第i位改成1
x|=(1<<i)//将一个数字x第i位改成1
判断二进制中有多少个1
int Lowbit(int x){return x & -x;}
int count(int x){//判断二进制中有多少个1
int cnt=0;
while(Lowbit(x)!=0){
cnt++;
x-=Lowbit(x);
}
return cnt;
}
同时可以通过函数:
统计二进制下0的个数:__builtin_popcount(x)