Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

7年前关闭。



Improve this question




如何在C++中实现该算法?
这样的任务有一个大小为N的位集。需要一致地遍历所有位集悬空k = 1,2,... l,直到序列总数不等于M。也就是说,结果应该是数组:
0 ... 001
0 ... 010
0 ... 100
...
1 ... 000
0 ... 011
0 ... 101
0 ... 110
....
....
etc

权重为1时,向左明显左移。但是如何处理权重k = 2,3,...的位集,同时又保持算法的质量,我不知道。请帮助,有人可以面对类似的挑战吗?
使用boost::dynamic_bitset实现的位集。 C++语言。

最佳答案

您可能会发现此C代码很有帮助。

函数make_sets生成具有一定权重的所有位模式,因此main对其进行多次调用,首先生成具有1个设置位,然后具有2个设置位等的模式。

#include <stdio.h>

#define BYTETOBINARYPATTERN "%d%d%d%d%d"
#define BYTETOBINARY(byte)  \
  (byte & 0x10 ? 1 : 0), \
  (byte & 0x08 ? 1 : 0), \
  (byte & 0x04 ? 1 : 0), \
  (byte & 0x02 ? 1 : 0), \
  (byte & 0x01 ? 1 : 0)

/* Make all bitsets with bits_to_add set bits in the least significant num_bits bits
The most significant bit are taken from high_bits.*/
void make_sets(int high_bits, int bits_to_add, int num_bits) {
    // Recurse on the position of the next set bit
    int i;
    if (bits_to_add) {
        for(i=bits_to_add-1;i<num_bits;i++)
            make_sets(high_bits + (1<<i), bits_to_add-1, i);
    } else {
        printf (BYTETOBINARYPATTERN"\n", BYTETOBINARY(high_bits));
    }
}

int main(int argc,char *argv[]) {
    int M;
    for(M=1;M<=5;M++)
        make_sets(0,M,5);
}

产生输出:
00001
00010
00100
01000
10000
00011
00101
00110
01001
01010
01100
10001
10010
10100
11000
00111
01011
01101
01110
10011
10101
10110
11001
11010
11100
01111
10111
11011
11101
11110
11111

关于c++ - 枚举位集随着权重的增加而增加。 (C++和Boost::dynamic_bitset),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19197487/

10-10 18:28