二进制中1的个数

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

解法一:循环次数为整数二进制的位数,32位的整数需要循环32次。

class Solution {
public:
     int  NumberOf1(int n) {
         int res = 0;
         unsigned int flag = 1;
         while(flag){
             if(n&flag){
                 res++;
             }
             flag = flag<<1;
         }
         return res;
     }
};

解法二:推荐解法,把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变成0.则这个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

1100 - 1 = 1011

1100 & 1011 = 1000 (正好把最右边的1变为0了)

1000 - 1 = 0111

1000 & 0111 = 0 (最终得到1100中1的个数为 2)

class Solution {
public:
     int  NumberOf1(int n) {
         int res = 0;
         while(n){
             res++;
             n = n&(n-1);
         }
         return res;
     }
};
原文地址:https://www.cnblogs.com/Bella2017/p/11818408.html