比如求0 1 0 1 0 1 0 0 0 0
0 1 0 1 0 1 0 0 0 0 - 1 = 0 1 0 1 0 0 1 1 1 1
0 1 0 1 0 1 0 0 0 0
&
0 1 0 1 0 0 1 1 1 1
(val - 1) & val 从低位开始,直至第一位为1的这部份给清0了。
#include <stdio.h> #include <stdlib.h> int BitCount2(unsigned int val) { unsigned int c = 0 ; for (c = 0; val; ++c) { val &= (val - 1) ; // 清除最低位的1 } return c ; } int main() { printf("%d\n", BitCount2(0xfe)); }
//第2种方法
int BitCount2(unsigned int val) { unsigned int c = 0 ; while(val){ if(val & 1 == 1){ ++c; } val >>= 1; } return c ; }