您的位置:首页 > 其它

三种方法判断二进制中1的个数

2021-04-12 00:03 20 查看

余数方法(最简单,最易理解的算法):

#include <stdio.h>
int main()
{
int i, n;
int count = 0;

scanf_s("%d", &n);
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;

}
printf("%d\n", count);
}


但是如果为负数结果就很难预料:
修改为无符号类型则可以解决这个问题:

#include <stdio.h>
int can(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;

}
return count;
}
int main()
{
int i, n;
int count = 0;

scanf_s("%d", &n);
i=can(n);

printf("%d\n",i );
}


位操作方法(难度中):

通过移位操作和1作比较,将两个数进行位运算,结果位1则计数一次反正不执行。

#include <stdio.h>
int main()
{
int i, a;
int count = 0;

scanf_s("%d", &a);
for (i = 0; i < 32; i++)
{
if (((a >> i) & 1) == 1)                                       
{
count++;
}
}
printf("%d\n", count);
}

通过一个算法判断程序执行次数推断1的个数:(执行效率最高)

#include <stdio.h>
int main()
{
int i, n;
int count = 0;

scanf_s("%d", &n);
while (n)
{
n = n & (n - 1);
count++;

}
printf("%d\n", count);
}

算法:n=n&(n-1):
输入:13
//1101    n     13
&
//1100    n-1   12
//1100    赋值给n   12
&
//1011    n-1       11
//1000     n       8
&
//0111    n-1    7
//0000
运算一次则让最右边少1,直到全为0为止就可以了。
注:本次程序在VS2019中测试。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: