规律总结:
每执行一次x = x&(x-1),效果 使得 x二进制的最后一个 “1”变为零。
如 x=8(10)
8&7
01000(2)& 00111(2)
结果为0
如 x=3(10)
011 (2)& 010(2)
结果为10(2)
用法:
①统计1的个数
求下面函数的返回值
---------------------------------------
int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
---------------------------------------
假定x = 9999
10011100001111
答案: 8
思路: 将x转化为2进制,看含有的1的个数。
②判断一个数(x)是否是2的n次方
-------------------------------------
#include <stdio.h>
int func(int x)
{
if( (x&(x-1)) == 0 )
return 1;
else
return 0;
}
int main()
{
int x = 8;
printf("%d/n", func(x));
}
-------------------------------------
注:
(1) 如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0。
(2) == 优先级高于 &
#include <stdio.h>
/*输出十进制整数的二进制表达式,32位*/
void outBin(int n)
{
int a[32], i = 0;
if (n == 0)
{
printf("0");
return;
}
while (n > 0)
{
a[i++] = n % 2;
n >>= 1;
}
while (i--)
{
printf("%d", a[i]);
}
}
/*统计一个整数二进制表达式中1的个数*/
int func(int x)
{
int countx = 0;
while (x)
{
countx++;
x = x & (x-1);
}
return countx;
}
void funy(int y)
{
int county = 0;
printf("请看这个整数%d/n",y);
if (((y & (y - 1)) == 0) && (y > 0)) /*注意:【==】 优先级高于 【&】*/
{
while((y%2) == 0)
{
y >>= 1;
county++;
}
printf("它是2的%d次方/n",county);
}
else
{
printf("这个整数不是2的次方数!");
}
}
int main()
{
int x = 999;
int y = 1024;
printf("请看这个整数%d/n",x);
printf("二进制表达为");
outBin(x);
printf("/n");
printf("共有%d个1/n",func(x));
printf("通过(x &= x-1)变换展示如下:/n");
while (x)
{
outBin(x);
printf("/n");
x &= x-1;
}
printf("/n");
funy(y);
getchar();
return 0;
}
转自百度空间http://hi.baidu.com/hh20040410/blog/item/c9512cd67ef62a2706088b09.html