二进制中1的个数

任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4

 1 #include "stdafx.h"
 2 
 3 //可能引起死循环,当n为负数时 
 4 int NumberOf1_Solution1(int n)
 5 {
 6     int count = 0 ;
 7     while(n)
 8     {
 9         if(n & 1)
10             count++ ;
11         n = n >> 1;
12         
13         // cout+=n&1;
14         // n >>=1;
15     }
16     return count ;
17 }
18 
19 //循环次数等于整数二进制的位数 
20 int NumberOf1_Solution2(int n)
21 {
22     int count = 0 ;
23     unsigned int flag = 1;
24     while(flag)
25     {
26         if(n & flag)
27             count ++ ;
28         flag = flag << 1;
29         // count +=n&flag?1:0;
30         // flag<<=1;
31     }
32     return count;
33 }
34 
35 /*最佳方法 整数有几个1就循环几次  
36 把一个整数减去1,再和原来整数做与运算,会把该整数最右边一个1变成0。
37 那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
38 */ 
39 int NumberOf1_Solution3(int n)
40 {
41     int count = 0 ;
42     while(n)
43     {
44         n = (n-1) & n ;
45         count ++ ;
46     }
47     return count ;
48 }
49 
50 int main()
51 {
52     int number ;
53     printf("请输入一个整数 (ctrl+z退出) :");
54     while(scanf("%d",&number) != EOF)
55     {
56         if(number >= 0)
57             printf("Solution1 is: %d
Solution2 is: %d
Solution3 is: %d
", 
58             NumberOf1_Solution1(number), NumberOf1_Solution2(number), NumberOf1_Solution3(number));
59         else  //当number<0 时 只用方法2,3计算 
60             printf("Solution2 is: %d
Solution3 is: %d
",NumberOf1_Solution2(number), NumberOf1_Solution3(number));
61             
62         printf("请输入一个整数 (ctrl+z退出) :");
63     }
64     return 0 ;
65 }

运算结果如下:

原文地址:https://www.cnblogs.com/sankexin/p/5615248.html