x&(x-1)基本上有两个作用:求x的二进制“1”的个数和判断x是否为2的n次方
1. 求其二进制“1”的个数可以有以下代码
int func(int x)
{
int count= 0;//count为其二进制“1”的个数
while(x)
{
count++;
x = x&(x-1);//注意这一语句与上一语句的位置
}
return count;
}
假定x = 19
10011
答案: 3
2.判断一个数(x)是否是2的n次方
void func(int x)
{
if(x&(x-1) ==0)
printf("%d is 2^n",x);
else
printf("%d is not 2^n",x);
return ;
}
分析:
当x为奇数的时候,x=x&(x-1)它的值相当于x = x-1;一样的效果
当x为偶数的时候,x=x&(x-1)它的值相当于x = 0;一样的效果