如何设置k位设置的所有长度为n的二进制模式? (使用递归)

时间:2017-09-04 03:06:01

标签: algorithm recursion binary bit-manipulation

我想编写一个函数,生成长度 n 的所有二进制模式,并设置 k 位。模式可以存储在二维阵列中。看起来我需要递归来实现这一目标。任何代码或伪代码都会有所帮助。

示例:如果n = 5且k = 3,则生成:

111 00
11 0的 1 0
11 00 1
1 0的 11 0
1 0的 1 0的 1
1 00的 11
0的 111 0
0的 11 0的 1
000的 11
00的 111

我发现了类似帖子:Generate all binary strings of length n with k bits set,但建议的解决方案计算所有2 ^ k组合。

2 个答案:

答案 0 :(得分:0)

For i = 0...(1<<n)-1
    If countsetbits(i) == k
        Store into collection

countsetbits(i)的位置:

j = i
For b = 0...n
    If j == 0
        Return b
    j = j And (j - 1)

用你的例子,其中

n = 5, k = 3

你得到了

i     b j=0? j     And(j-1)          Return b   Main loop
0...6                                           less than k
7     0 No   111b  And 110b = 110b  
      1 No   110b  And 101b = 100b  
      2 No   100b  And 011b = 000b  
      3 Yes                          3          k, hence store into collection
8     0 No   1000b And 0111b = 0000b
      1 Yes                          1          less than k
9     0 No   1001b And 1000b = 1000b
      1 No   1000b And 0111b = 0000b
      2 Yes                          2          less than k
10    0 No   1010b And 1001b = 1000b
      1 No   1000b And 0111b = 0000b
      2 Yes                          2          less than k
11    0 No   1011b And 1010b = 1010b
      1 No   1010b And 1001b = 1000b
      2 No   1000b And 0111b = 0000b
      3 Yes                          3          k, hence store into collection
...
31    ...                            5          greater than k

答案 1 :(得分:0)

这个任务的递归实现非常简单(Delphi和伪代码)

  procedure GenKBits(Value, Position, N, K: Integer);
  begin
    if K = 0 then
      Output Value in binary
    else
      if (Position < N) then begin
        GenKBits(Value or (1 shl Position), Position + 1, N, K - 1); //set bit
        GenKBits(Value, Position + 1, N, K);             //use zero bit
      end;
  end;

call  GenKBits(0, 0, 4, 2) gives

0011
0101
1001
0110
1010
1100