**比如:15 的二进制数位0000 0000 0000 0000 0000 0000 1111 ,则结果返回4
**
程序原型:int count_one_bits(unsigned int value)(说明:采用unsigned是int类型的-1中1的个数位32,-1是负数,在计算机中存的时补码)
(1)方法一
<类比于十进制>
例如:输出123 的每一位的数字
123%10=3
123/10=12 12%10=2
12/10=1 1%10=1
输出十进制数字的每一位采用/10 ,%10的方法,
同样地类比于十进制,二进制数就采用/2 ,%2 的方法。
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
while (num != 0)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
return count;//返回count次数
}
int main()
{
int num ;
printf("请输入整数:");
scanf("%d", &num);
printf("整数中1的个数为:%d\n", count_one_bits(num));
return 0;
}
(2)方法二
<用单目操作符&> (常规解法)
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((num >> i) & 1 == 1)//num右移i位与1相与,看结果是否为1.如果结果为1,num第i位为1,否则为0.总共移动32次.
{
count++;
}
}
return count;//返回count次数
}
int main()
{
int num;
printf("请输入整数:");
scanf("%d", &num);
printf("整数中1的个数为:%d\n", count_one_bits(num));
return 0;
}
(3)方法三
例如:求二进制数字7中1的个数(为了方便,我只写最后8位)
0000 0111 7
& 0000 0110 6
0000 0110 6(结果)
& 0000 0101 5
0000 0100 4(结果)
& 0000 0011 3
0000 0000 0
二进制数7减一之后与其相与,相与三次之后为0,且7的1的个数为3。
由此可得,当num不为0时,循环num&(num-1),直到最后相与结果为0。则相与的次数就是二进制数num中1的个数。
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
int i = 0;
while (num!=0)
{
num = num&(num - 1);
count++;
}
return count;//返回count次数
}
int main()
{
int num;
printf("请输入整数:");
scanf("%d", &num);
printf("整数中1的个数为:%d\n", count_one_bits(num));
return 0;
}
以上三种代码运行结果都如下所示: