我需要一种快速方法来查找长度为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位体系结构上可以实现显着的加速,那么这也会很有趣。
答案 0 :(得分:4)
通过使用不影响固定位的特殊增量循环2 n 可能性,有一种相当简单的整数数学方法。
该增量为
x = (x | isfixed) + 1 & ~isfixed | fixedvalue;
第一个OR使固定位置为1,这意味着来自+1的进位将通过它们。然后固定位恢复到正确的值。
或者,如果您可以访问_pdep_u64
或等效,则可以在0到2 nm 的所有整数上使用普通旧循环,然后将这些位扩展到所有_pdep_u64(i, ~isfixed)
的非固定职位,然后填写固定职位。