N用位掩码选择K位置换

时间:2016-05-11 18:03:20

标签: bit-manipulation permutation bitmask

我正在尝试查找/创建一个稍微繁琐的算法,该算法生成K - 位计数位掩码中1的所有N位计数排列,其中{{ 1}}。排列数为K < N

These two algorithms, from Bit Twiddling Hacks,很接近。

(N choose K) = N!/(K!(N-K)!)

同样。

unsigned int v; // current permutation of bits where bitCount(v) == K
unsigned int w; // next permutation where bitCount(w) == bitCount(v)

unsigned int t = v | (v - 1);
w = (t + 1) | (((~t & -~t) - 1) >> (trailingZeroCount(v) + 1)); 

这些算法以字典顺序生成排列,这是我不一定需要的。但是,我确实需要一个包含位掩码unsigned int v; // current permutation of bits where bitCount(v) == K unsigned int w; // next permutation where bitCount(w) == bitCount(v) unsigned int t = (v | (v - 1)) + 1; w = t | ((((t & -t) / (v & -v)) >> 1) - 1); 的算法。

m

1 个答案:

答案 0 :(得分:1)

一种选择是在Intel Haswell中使用诸如PEXT之类的CPU指令以及更新的指令来扩展您提到的掩码中的比特琐事解决方案的结果。如果您没有这样的指令,您可能需要一个循环。我在this answer中给出了两种可能性。