解法一:若二进制末尾为1,则除以2余1;
int count(int a) { int num=0; while(a) { if(a%2==1) ++num; a=a/2; } return num; }
解法二:使用移位操作相除:
int count(int a) { int num=0; while(a) { num+=a&0x01; a>>=1; } return num; }
解法三:以上两种算法复杂度log2(t),t为a的二进制表示位数,若要求复杂度仅与二进制表示中1的个数相关,则有:
int count(int a) { int num=0; while(a) { a&=a-1; ++num; } return num; }
当然也可以采取查表法,以时间换空间,获得O(1)的复杂度;
编程之美——二进制数中1的个数,布布扣,bubuko.com
原文:http://www.cnblogs.com/chengyuz/p/3901538.html