【问题标题】:How to iterate over all the bitstrings with one 0, two 0s, all the way down to n 0s?如何用一个 0、两个 0 一直迭代到 n 个 0 的所有位串?
【发布时间】:2012-02-16 22:09:35
【问题描述】:

我有一个增加位串的函数,如下所示:

void increment(boost::dynamic_bitset<> &bitset)
{   
    for (int loop = 0; loop < bitset.size(); ++loop)
    {
        if ((bitset[loop] ^= 0x1) == 0x1)
        {
            break;
        }
    }
}

我想要一个以与调用增量相同的方式调用的函数,但以不同的方式修改位串。每次调用它时,我都想获得与前一个具有相同数量 0 的下一个位串。

例如,如果位串的长度为 10,则对该函数的前 10 次调用将给出一个带有单个 0 的位串。然后,调用 11 到 20 将返回具有 2 个 0 的位串。我希望这一直持续下去,直到位串全为 0。

如何设置这样的功能?谢谢!

【问题讨论】:

  • 看起来是 XY 问题
  • 如果你的字符串长度只有 10,你可以迭代整数范围 [0, 1 &lt;&lt; 10) 并使用这些整数。
  • @SethCarnegie 好的,对问题的澄清:) 我用一个位串表示一组大对象,并希望对该位串的所有子集进行一些测试。但是,我知道我感兴趣的子集通常只缺少集合中的几个元素,因此我想从仅删除一个元素开始生成所有子集并向下工作。
  • @KerrekSB 那是为了说明。位串的长度通常至少为 400。
  • 长度为 10 的位串有 9 个,有一个零,有 36 个位串,有两个零。有相当多的长度为 400 的位串带有两个零。这是二项式系数。

标签: c++ boost bit-manipulation boost-dynamic-bitset


【解决方案1】:

您可以在Matters Computational,第 1.24.3 章“轮班顺序”中找到答案。您必须将整数更改为位集并翻转值。与位集一起使用时,此实现可能不是最佳的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2021-04-15
    • 2021-03-16
    • 2016-10-14
    • 2013-02-04
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多