与标题中的问题相同。 我做了两种方法。一个是直截了当的。 从
生成所有位掩码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。
这种方法有用还是我实施了一些不好的方法?也许存在另一种有趣的方法? 感谢
克里斯
答案 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'。