所有可能的长度为n的二进制字符串,其中特定位置的位固定

时间:2016-08-25 17:42:29

标签: c++11 bit-manipulation

我需要一种快速方法来查找长度为n的所有二进制字符串,其中m位的位已固定。 C++11兼容函数,其例如使用带有键的std:map固定位的位置并且值固定位的值。输出std::bitset<n> s或std::vector<n>的向量会很好。例如,一个功能:

std::vector< std::bitset<n> > compatible(int n, const std::map<int,bool>& fix) 

例如,如果n=3我们将第二位修复为1,那么答案应为

{{0,1,0},{0,1,1},{1,1,0},{1,1,1}}

订单无关紧要。

如果另一个数据结构快得多,那么我更喜欢速度。此外,如果n < 50在64位体系结构上可以实现显着的加速,那么这也会很有趣。

1 个答案:

答案 0 :(得分:4)

通过使用不影响固定位的特殊增量循环2 n 可能性,有一种相当简单的整数数学方法。

该增量为

x = (x | isfixed) + 1 & ~isfixed | fixedvalue;

第一个OR使固定位置为1,这意味着来自+1的进位将通过它们。然后固定位恢复到正确的值。

或者,如果您可以访问_pdep_u64或等效,则可以在0到2 nm 的所有整数上使用普通旧循环,然后将这些位扩展到所有_pdep_u64(i, ~isfixed)的非固定职位,然后填写固定职位。