此题思路较为巧妙。
若直接做右移位运算,则当为负数时,对其右移一位,为了保持负数,则其最左端会替换为1,而非正数的0。则继续进行右移,会导致最后负数变成0xFFFFF,故而要另寻出路。
将数据按照位数由低到高与1做与运算,若该位是1,与运算结果必为1.即1需要持续左移直到判断完毕,那么32位数据就需要做32次与运算。
最后考虑当数据减去1,最右边的第一个1会变成0,该位右边的0会变成1,而该位左边则不发生变化。且减去1后的数据,与原数据做与运算,则除了最右边的一个1会变成0外,其余位数字都不发生改变,且数据中有几个1就可以做几次这样的运算。(如1010,首先1010-1 = 1001,之后1010 & 1001 = 1000,即经过此番过程,1010最右边的1变为0)

class Solution {
public:
     int  NumberOf1(int n) {
         int i = 0;
         while (n) {
             ++i;
             n = n & (n - 1);
         }
         return i;
     }
};