#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.
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。