计算所有设置位的最快方法是什么?

时间:2020-12-21 22:58:17

标签: c++ bit-manipulation bitset

计算所有设置位的最快方法是什么?
我计算位数的数字来自 1<=n<2^63,只有正值。

现在我使用库中的 bitset 并且它非常快,但是如果有任何更快的选择,我想知道。

在最坏的情况下,我有超过 10 亿次迭代,所以我正在寻找一种方法来加快速度。
这是我计算设置位的循环的一部分:

if (std::bitset<64>(currentNumber).count() == numofOnes)
++counter;

1 个答案:

答案 0 :(得分:2)

这是我对平衡查找表的含义的演示。
这个对节省尺寸很重要。
您可以将该概念应用于大小的查找表,例如64 或 256,显着加快。

#include <iostream>

using namespace std;

int main()
{
   unsigned long long int input=679043ULL; // just a big number, for demo
   
   unsigned char lookup[16]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
   unsigned char result=0;

   while (input>0)
   {
       cout << (unsigned int) result << " " << (input&15) << " " << input << endl;
       result+=lookup[input&15];
       input>>=4;
   }
   cout << (unsigned int)result << endl;
   return 0;
}

输出:

0 3 679043
2 8 42440
3 12 2652
5 5 165
7 10 10
9

演示输出显示循环累积
“3”中的 2 位,
“8”中的 1 位,
“12”中的 2 位,
“5”中的 2 位,
“10”中的两位;
共 9 个。