剑指Offer——二进制中1的个数

题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。


分析:

加入一个数的二进制位是XXX...XXX1000...000,那么这个数减去1,就会变成XXX...XXX0111...111,将这两个数相与(即&),

那么就可以得到XXX...XXX0000...000,将原来的数的最后一个1变成0。

然后我们就可以继续用相同的方法探究更高位XXX...XXX中的1的个数了,每循环一次就将最后一个1变成0。

所以循环一共执行了该数中1的个数那么多次数。如果1的个数少的话,那么该算法将特别的快,不必遍历每一个bit位。


代码:

 1 class Solution {
 2 public:
 3     int NumberOf1(int n) {
 4         int cnt = 0;
 5         int m = n;
 6         while(m) {
 7             m = m & (m - 1);
 8             cnt++;
 9         }
10         return cnt;
11     }
12 };
原文地址:https://www.cnblogs.com/jacen789/p/7743072.html