11二进制中1的个数

 1 二进制中1的个数
 2 //题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
 3 //思路:先判断整数二进制表示的最右边的一位是不是1,接着把输入的整数右移一位,
 4 //此时再判断从右边数起的第二位被移到最右边,再判断是不是1。直至整个数变为0;
 5 //只需要把整数和1做位与运算,看结果是不是0;
 6 //------通常做法(不建议使用)没有考虑到负数-----
 7 //对于负数,向右移位会补1,所以本题不合适
 8 class Solution
 9 {
10 public:
11     int NumberOf1(int n)
12     {
13         int count = 0;
14         while(n)
15         {
16             if (n & 1 == 1)
17             {
18                 count++;
19             }
20             n = n>>1;
21         }
22         return count;
23     }
24 
25 };
26 //------常规做法(将标志位flag左移)-----
27 //将标志位1向左移位,然后与数进行相与
28 class Solution
29 {
30 public:
31     int NumberOf1(int n)
32     {
33         int count = 0;
34         int flag = 1;
35         while(flag)
36         {
37             if(n & flag )
38             {
39                 count++;
40             }
41             flag = flag << 1;
42         }
43         return count;
44     }
45 
46 };
47 //------高级解法---------------------
48 //思路:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。一个整数中右多少个1,就可以进行多少次这样的操作。
49 //例如:1100 ,减去1之后为1011, 1100 & 1011 = 1000,此时结果将1100最右边的1转化为0.
50 class Solution
51 {
52 public:
53     int NumberOf1(int n)
54     {
55         int count = 0;
56         while(n)
57         {
58             count++;
59             n = (n-1)& n;
60         }
61         return count;
62     }
63 
64 };

 

posted @ 2017-08-20 18:04  繁星的夜空2012  阅读(139)  评论(0编辑  收藏  举报