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

 8    二进制为:0000 1000=>  8/2=4   4/2=2  2/2=1(一的个数为1)
 11  二进制为:0000 1011=>  11/2=5...1   5/2=2...1  2/2=1(一的个数为3)
 31  二进制为:0001 1111=>  31/2=15...1  15/2=7...1  7/2=3...1  3/2=1...1  1/2=0(一的个数为5)
 26  二进制为:0001 1010=>  26/2=13    13/2=6.. .1  6/2=3   3/2=1...1   1/2=0(一的个数为3)

发现规律:当一个整数多次除以二后,它的商和余数为一的个数就是整数对应二进制中1的个数

1.这种方法只能实现对正整数的求法。

 1 #include<stdio.h>
 2 
 3 int count_one_bits(unsigned int value)
 4 {
 5     int count = 0;
 6     while (value / 2 != 0)
 7     {
 8         if (value % 2 == 1)
 9         {
10             ++count;
11             value = value / 2;
12             if (value == 1)
13             {
14                 ++count;
15                 continue;
16             }
17         }
18         else
19         {
20             value = value / 2;
21             if (value == 1)
22             {
23                 ++count;
24                 continue;
25             }
26         }
27     }
28     return count;
29 }
30 
31 int main()
32 {
33     int i;
34     printf("请输入数字:
");
35     scanf("%d", &i);
36     int num = count_one_bits(i);
37     printf("%d", num);
38     return 0;
39 }


2.应用  <<  >>  移位的方法

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 int Count_one_bits(int a)
 5 {
 6     int count = 0;
 7     while (a!=0)
 8     {
 9         if (a & 1 == 1)
10         {
11             ++count;
12             a = a >> 1;
13         }
14         else
15         {
16             a = a >> 1;
17         }
18     }
19     return count;
20 }
21 
22 int main()
23 {
24     //int c;
25     //int b = 6; //0000 0110
26     //int a = 11;//0000 1011
27     //           //printf("%d
",a >> 1);//0000 0101 (5)
28     //           //printf("%d
",a << 1);//0001 0110 (22)
29     //c = a & b;//2   0000 0010
30     //printf("%d", c);
31     int a;
32     printf("请输入数字:
");
33     scanf("%d",&a);
34     int count = Count_one_bits(a);
35     printf("%d",count);
36 
37     return 0;
38 }
原文地址:https://www.cnblogs.com/cuckoo-/p/10354835.html