n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:
n = 10110(二进制),则(n-1) = 10101 ==》n&(n-1) = 10100
可以看到原本最低位为1的那位变为0。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//输出1的个数
int x=7;
int sum=0;
while (x)
{
sum++;
x&=(x-1);
}
cout<<sum<<endl;
}
原理:
举例说明:
n=1000,则n-1=0111,所以 n&(n-1)=0,
而当n=1001,n-1=1000,所以n&(n-1)!=0
//判断是不是2的n次方
if((x > 0) &&(x&(x-1)==0))//注意0也会使得x&(x-1)==0条件成立
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
参考:n & (n-1)