计算所有设置位的最快方法是什么?
我计算位数的数字来自 1<=n<2^63,只有正值。
现在我使用库中的 bitset 并且它非常快,但是如果有任何更快的选择,我想知道。
在最坏的情况下,我有超过 10 亿次迭代,所以我正在寻找一种方法来加快速度。
这是我计算设置位的循环的一部分:
if (std::bitset<64>(currentNumber).count() == numofOnes)
++counter;
答案 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 个。