怎么高效计算出一个数(可能是相当大的)的二进制表示数中1的个数

如何高效计算出一个数(可能是相当大的)的二进制表示数中1的个数?
如何高效计算出一个二进制数中1的个数?假设这个二进制数位数很长呢?比如有100位以上呢?我知道一个算法如下,但是否对超过32位的都不行了,且不知效率是否是最高的?我的老师专出难题呀!

#include<iostream>
using namespace std;
int main()
{
int num;
cin >> num;
int countNumber0(int num);
    int counter = 0;
    while (num)
    {
    num &= num - 1 ;
counter++;
    }
cout<<counter<<endl;
return 0;
}

------解决方案--------------------
一个数 再大, 也是要存在内存中的,能存在 内存中 ,那么就可以分割成一个字节一个字节的来算

统计一个 字节有多少个0,多少个1,这个简单吧,lz你给的算法就可以,ls的查表就更快

然后这个数占用多少个个字节,你挨个加起来就可以了
------解决方案--------------------

while(a)
{
count += a & 0x1;
a = a >> 1;
}
------解决方案--------------------
while(num)
{
    if(num & (1 ) == 1)
    {count ++; num>>=1;
}
------解决方案--------------------
直接转为byte*,计数
------解决方案--------------------
将0x00~0xFF中对应二进制1的个数构成一张表
unsigned char bit1count[256]={0,1,...,8};
对需要求二进制1的个数的字节序列中的每个字节查该表并累加。
------解决方案--------------------
效率最高?当然不是啦!
高人太多!
没有最快,只有更快!
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive

------解决方案--------------------
引用:
效率最高?当然不是啦!
高人太多!
没有最快,只有更快!
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive

学习了。

无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

------解决方案--------------------
引用:
查表法。
#include <iostream>
#include <numeric> 

using namespace std;
int main()
{
  auto op = [](int sum, unsigned char uc)->int{
    static int tbl[16] = {
      0, // 0000
      1, //0001
      1, //0010
      2, //0011
      1, //0100
      2, //0101
      2,//0110
      3,//0111
      1,//1000
      2, //1001
      2,//1010
      3,//1011
      2,//1100
      3,//1101
      3,//1110
      4,//1111
    };
    return sum + tbl[uc&0xF] + tbl[(uc & 0xF0) >>4];
  };
  long long a;
  std::cout << std::accumulate((unsigned char*)&a, (unsigned char*)(&a + 1), 0, op) << std::endl;
  return 0;


------解决方案--------------------
现在一般的操作系统能处理64比特数字的运算,再加上一些扩展可以处理128比特,低于这个限制的可以用数学运算的方法。

超长的二进制数根本无法用基本数据类型来表示,往往输入就是字符串形式,如:

10010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001

这时候,一切基于数学数值的方式都不行了,就是处理字符串了。
------解决方案--------------------
引用:
希楼上的大哥用示例作一个示范,否则小妹根本就看不懂啊?
呦,居然是妹子~~~
16楼的意思就是说二进制数存储为数组的形式,这个时候你就要遍历整个字符串数组,挨个比较和字符'1'是否相等,然后计数。
但是也不是很大的二进制数就必须用字符串表示,可以使用C++类库的bitset。
------解决方案--------------------
引用:
现在一般的操作系统能处理64比特数字的运算,再加上一些扩展可以处理128比特,低于这个限制的可以用数学运算的方法。

超长的二进制数根本无法用基本数据类型来表示,往往输入就是字符串形式,如:

10010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001100101011101000110010101110100011001010111010001

这时候,一切基于数学数值的方式都不行了,就是处理字符串了。

仅供参考
//有一个二进制文件,要求每隔50bits,删除后面的12bits。