C语言:求二进制中1的个数(3种方法)

C语言:求二进制中1的个数(3种方法)

题目:写一个函数返回参数二进制中 1 的个数

比如: 15-> 0000 1111 4 个 1

程序原型:

int count_one_bits(unsigned int value)

{

// 返回 1的位数

}

介绍三种方法:

方法一:模2取余求个数

例如:

#include

#include

#pragma warning(disable:4996)

int count_one_bits(unsigned int value)

{

int count = 0;

while (value)

{

if (value%2 == 1)

{

count++;

}

value /= 2;

}

return count;

}

int main()

{

int value=15;

int count = count_one_bits(value);

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

system("pause");

return 0;

}

方法二:位运算

&的规则是,有0,则为0 ,所以,我们只需让value&1,然后检测最低比特位即可判断出该二进制中有多少个1

代码如下:

int count_one_bits(unsigned int value)

{

int count = 0;

while (value)

{

if (value & 1)

{

count++;

value = value >> 1;

}

}

return count;

}

int main()

{

int value=15;

int count = count_one_bits(value);

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

system("pause");

return 0;

}

因为二进制共32位,如果高位为1,低位很多0,要一个个遍历,不够高效

方法三:位运算(优化)

value-1,可以快速的定位到最近的1,让后面的0向前面借位,前面为0,后面为1,&之后末尾为0,每次都能消掉最右边的1,这样就不用检测高比特位了(有几个1,就处理几次)

int count_one_bits(unsigned int value)

{

int count = 0;

while (value)

{

value &= (value - 1);//

count++;

}

return count;

}

int main()

{

int value=15;

int count = count_one_bits(value);

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

system("pause");

return 0;

}

相关文章

快手怎么取消免密支付
365bet亚洲真人

快手怎么取消免密支付

07-01 823
电脑如何删除密保问题及设置
28365365体育在线备用

电脑如何删除密保问题及设置

06-30 9245
冰柜保鲜柜
28365365体育在线备用

冰柜保鲜柜

06-29 1451
到底有多少人加过假明星QQ?
28365365体育在线备用

到底有多少人加过假明星QQ?

07-04 1973
App为何频繁更新?到底升级了什么?
365bet亚洲真人

App为何频繁更新?到底升级了什么?

06-30 2605
steam游戏怎么重装系统
28365365体育在线备用

steam游戏怎么重装系统

06-29 7977