<span style="font-size:18px;">写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
</span>
<span style="font-size:18px;">方法一:参数为整形参数,首先需要将整形参数转换为二进制序列,需要对这个参数进行模2除2。参数为正整数很容<span style="font-family: Arial, Helvetica, sans-serif;">易就得出了正确结果,但是对于负整数来说直接模2除2得出的序列为0;在参数前加上unsigned关键字就可以解决参数</span></span>
<span style="font-size:18px;">为负数的问题。</span>
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int count_one_bits(unsigned int value)
{
// 返回 1的位数
int count = 0;
int i = 0;
while (value != 0)
{
if (value % 2 == 1)
{
count++;
}
value = value / 2;
}
return count;
}
int main()
{
int num;
num = count_one_bits(-1);
printf("%d", num);
system("pause");
return 0;
}
方法二:对一个数按位对1取&(与);若二进制数末尾为0,对1取&后得到为0;若二进制数末尾为1,对1取&后得到为1;一个末尾数判断结束,二进制序列向右移一位再重复执行上述步骤即可;
移位操作:num = num >> 1;
比如 10的二进制序列1010,对1(0001)按位&之后为:0000,得到了二进制序列的末尾数。将1010向右移一位,在按位对1取&为:001。向右移位,按位取&直到32个二进制位全部移位。
int main()
{
int num = -1;
int i = 0;
int count = 0;
for (i = 0; i < 32;i++)
{
if ((num & 1) == 1)
{
count++;
}
num = num >> 1;
}
printf("%d转换为二进制中1的个数为:%d",num, count);
system("pause");
return 0;
}
方法三:num=num&(num-1); 代入一个数会发现每执行一次,从低位开始消除一个1,直到num为0;
int main()
{
int num = 3;
int count = 0;
int c = num;
while (num!=0)
{
num = num&(num - 1);
count++;
}
printf(" %d 转换为二进制中1的个数为:%d个",c,count);
system("pause");
return 0;
}