x=x|(x+1)
的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。
x=x&(x-1)
的作用是每次循环把x的二进制中从右往左数的最后一位1变成0,直道变成全1的时候x就为全0,循环结束。
#include<stdio.h>
int count_zero(int x)
{
int n=0;
while((x+1))
{
n++;
x|=(x+1);
}
return n;
}
int count_one(int x)
{
int n=0;
while(x)
{
n++;
x&=(x-1);
}
return n;
}
int main()
{
printf("%d\n",count_zero(2014));
printf("%d\n",count_one(2014));
return 0;
}