方法一、利用二进制右移,判断末位1的数量

#include <iostream>
using namespace std;

int main() {
    long a,ans;
    cin>>a;
    while(a){
        ans+=a&1;
        a>>=1;
    }
    cout<<ans;
}

方法二、利用bitset01数组,使用count判断比特为1的数量

#include <bitset>
#include <iostream>
using namespace std;

int main() {
    long a;
    cin>>a;
    bitset<64> bt(a);
    cout<<bt.count();
}

方法三、使用c++编译器内置方法__builtin_popcountll(n)

#include <iostream>
using namespace std;

int main() {
    long a;
    cin>>a;
    cout<<__builtin_popcountll(a);
}

方法四、Brian Kernighan 算法

对任何一个数 n,n & ( n − 1 )的结果是n的比特位最右端的1变为0的结果

执行次数表示1的个数

#include <iostream>
using namespace std;

int main() {
    long n,ans=0;
    cin>>n;
    while(n){
        n&=(n-1);
        ans++;
    }
    cout<<ans;
}