位运算笔记

位运算

最近都快忘了位运算了,知道最近学习到状压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)
原文地址:https://www.cnblogs.com/hellohhy/p/13198305.html