生成长度为n且具有相同数量的1和0的二进制数

时间:2011-12-16 15:01:39

标签: bitmask

与标题中的问题相同。 我做了两种方法。一个是直截了当的。 从

生成所有位掩码
  

2 ^ {N - 1}

  

2 ^ N

并且对于每个位掩码检查是否存在相同数量的1和0,如果是,则对其进行处理。 这就是问题,因为我必须在这些位掩码上工作,而不仅仅是计算它们。

我第二种方法是在O(2 ^ {n / 2})时间运行,但似乎它没有生成所有的位掩码,我不知道为什么。

第二种方法是这样的: 生成从0到2 ^ {n / 2}的所有位掩码并拥有有效的位掩码(称之为B)我必须做这样的事情:B#~B

其中〜是否定的。

所以例如我有n = 6,所以我要生成长度为3的位掩码。

例如我有B = 101,所以~B将是010 最后的位掩码将是101010,我们看到,我们有相同数量的1和0。

这种方法有用还是我实施了一些不好的方法?也许存在另一种有趣的方法? 感谢

克里斯

2 个答案:

答案 0 :(得分:2)

尝试递归方法:

void printMasks(int n0, int n1, int mask) {
    if (!n0 && !n1) {
        cerr << mask << endl;
        return;
    }
    mask <<= 1;
    if (n0) {
        printMasks(n0-1, n1, mask);
    }
    if (n1) {
        printMasks(n0, n1-1, mask | 1);
    }
}

调用printMasks将所需数量的0和1传递给它。例如,如果您需要3个1和3个零,请按以下方式调用它:

printMasks(3, 3, 0);

答案 1 :(得分:0)

给定一个二进制数,有可能产生下一个更高的二进制数,它具有相同数量的'1',对足够大的单词使用恒定数量的操作来保存所有位(假设用幂除法)两个计数作为一个操作)。

识别最不重要的'1'的位置(提示:如果你递减数字会发生什么)和最不重要的'0'(提示:如果你将“最不重要的1”添加到原始状态会发生什么数字?)你应该将最低有效'0'更改为'1',并将适当数量的最低有效位设置为'1',并将插入位设置为'0'。