首页 > 试题广场 >

下列程序的输出是[$##$] #inc

[填空题]
下列程序的输出是1
#include <stdio.h>
int func(int v)
{
int c;
for(c=0;v;c++)
v&=v-1;
return c;
}
void main( )
{
printf("%d\n",func(16640));
}

int func(int v)
{
int c;
for(c=0;v;c++)
v&=v-1;
return c;
}

求二进制数中1的个数

v&(v-1)可以用于判断一个数的二进制是否只有一个1,而v=v&(v-1) 能移除掉v的二进制中最右边的1的性质,循环移除,直到将1全部移除,这种方法将问题的复杂度降低到只和1的个数有关系,即其运算次数与输入v的大小无关,只与v中1的个数有关。如果v的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。

与其等价的另一个快速法:n -= n &(~n + 1),每次进行这个操作时,也是移除最右侧1的过程

发表于 2019-04-09 10:07:08 回复(0)
16640-> 100000100000000
求二进制中1的个数
编辑于 2020-03-30 20:44:43 回复(0)