使用std::bitset实现一个二进制计数器

Implementing a binary counter using std::bitset

本文关键字:一个 二进制 计数器 std bitset 实现 使用      更新时间:2023-10-16

我想在c++中使用std::bitset实现一个二进制计数器。如果我明确地为bitset建立一个加法函数那么算法的复杂度将上升到O(n^2)有什么方法能求出O(n)吗?

还有,对于Horowitz和Sahni的子集和问题的解决方案有什么好的描述吗?除了维基百科,我找不到任何好的来源描述他们的算法。

对于你的第二个问题,"有没有关于Horowitz和Sahni的子集和问题解决方案的好的描述?",我找到了一些文章:

Horowitz和Sahni的原始论文:
http://www.cise.ufl.edu/萨尼/论文/computingPartitions.pdf

关于Horowitz和Sahni算法改进的Stackoverflow讨论:
生成范围内的所有子集和都快于O((k+N) * 2^(N/2))?

源代码:
http://www.diku.dk/hjemmesider/ansatte/pisinger/subsum.c

如果bitset足够小,所有的位都可以放在unsigned long中,那么你可以使用它的转换函数对它执行整数运算,例如

bitset = std::bitset(bitset.to_ulong() + 1);

在c++ 11中,还有一个to_ullong()函数,给出unsigned long long,它可能大于unsigned long

如果你的bitset太大,你最好实现你自己的,基于你的计数器可以访问的整数数组或向量。你的算法仍然是0 (n2),但是你可以减少每次加法所需的操作数量,而不是一次处理一个比特。