#include<stdio.h>
#include<stdlib.h>
//方法一:
int Numberof1(int n)
{
int count = 0;
while(n)
{
if(n & 1)
count++;
n = n >> 1; //位操作比乘除运算效率高。
}
return count;
}
//上面的程序如果传入的n是一个负数,将造成死循环。因为负数移位时要保留符号位。
//方法二:
int _Numberof1(int n)
{
int flag = 1;
int count = 0;
while(flag) //循环的次数与n的位数有关,时间复杂度高
{
if(n & flag)
count++;
flag = flag<<1;
}
return count;
}
//方法三:
int __Numberof1(int n)
{
int count = 0;
while(n) //有多少个1循环多少次,比较高效
{
count++;
n = n & (n-1);
}
return count;
}
int main()
{
int sum = 20;
int num1 = Numberof1(sum);
int num2 =_Numberof1(sum);
int num3 =__Numberof1(sum);
printf("%d,%d,%d\n",num1,num2,num3);
system("pause");
return 0;
}总结:

一般进行二进制操作时,都可以采用先-1,再按位与的方法。-1相当于从最右边的1到最低位,全都按位取反,再与的话,就把最右边的1置为0.
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。