以下提供两种方法:
方法1:位操作,循环右移
-
int Count(unsigned char n){
-
int count = 0;
-
while( n )
-
{
-
count += n&1;
-
n >>= 1;
-
}
-
return count;
-
}
这个方法的效率和位于最左面1的位置有关,比如01000000,需要循环7次,时间复杂度是O(log2n)
方法二:
从上面的方法我们可以发现前6次循环其实是多余的,如何使得我们执行效率直接与1的个数相关。
利用 n &= (n-1),直到n为0,这样的循环次数只和1的个数有关。
比如 10001000,用上面的式子每次可以识别出最右边的那个1
10001000 & 10000111 = 10000000这样最右边的1就被过滤掉了
10000000 & 01111111 = 00000000循环直接结束,1的个数也统计出来了
-
int Count(unsigned char n){
-
int count = 0;
-
while( n )
-
{
-
n &= (n - 1);
-
count++;
-
}
-
return count;
-
}
阅读(224) | 评论(1) | 转发(0) |