查找二进制数的组合(匹配1' s)

时间:2017-11-23 08:18:49

标签: algorithm binary combinatorics

给出二进制数, 什么算法可以找到所有匹配的二进制数,其中所有的1都对应于给定的数字。

例如: 输入:10010 输出:[10010,10011,10110,10111,11010,11011,11110,11111]

2 个答案:

答案 0 :(得分:1)

你也可以使用一些技巧

让我们考虑具有初始值的字节大小变量:
v = 00010010
找到下一个两个的力量:(注意:还有更有效的方法)

 b = 1
 while (b <= v)
     b = b << 1

现在b = 00100000
制作面具bm = b - 1 = 00011111
倒置初始值:
n = not v = 11101101
清除领先位:
mask = n & bm = 00001101

mask值包含我们需要填充的所有位。枚举给定位掩码的所有子掩码有点技巧:(并输出子掩码和初始值的联合)

sub = mask
while (sub) {
    output sub | v
    sub = (sub - 1) & mask;
   //clears LSB, sets trailing 0s, removes bits not presenting in mask
}
output sub | v 

德尔福代码:

var
  v, b, bm, n, mask, sub: Byte;
begin
  v := 16 + 2;
  if v < 2 then 
    Exit;
  b := 1;
  while (b <= v) do
     b := b shl 1;
  bm := b - 1;
  n := not v;
  mask := n and bm;
  sub := mask;
  while (sub > 0) do begin
    Writeln(IntToBin(sub or v, 8)); //binary representation
    sub := (sub - 1) and mask;
  end;
  Writeln(IntToBin(sub or v, 8));

输出:

00011111
00011110
00011011
00011010
00010111
00010110
00010011
00010010

答案 1 :(得分:0)

答案提示:您希望将1保持在原位。基本上,系统的公认语言是{0}。

解决方案#1:丑陋的

强制它并获取2 ^ n个二进制数,其中n是数字的大小。只保留符合您模式的那些。

解决方案#2:简化的

同样,你想保持1所在的位置。所以,你想找到所有带有模式的二进制文件,让我们调用 G 所有你的所有位置。你的数字大小为 N ,数字1是

意思是,您只需要在字符表格中取出所有大小为 2 ^(Ni)-1 的二进制文件(让我们将其命名为 B )并在 G 中包含的每个位置添加1。

示例:

输入:10010
G = {1,4}(基于0,我们在计算机上)

生成 2 ^(N-i)-1 表= [000,001,010,100,011,101,110,111]

将这些数字放入B(n表示 null )并将每个 null 替换为您的数字:
第一步:[1nn1n,1nn1n,1nn1n,1nn1n,1nn1n,1nn1n,1nn1n,1nn1n]
第二步:[10010,10011,10110,11010,10111,11010,11110,11111]

注意:

请记住,这些解决方案是基于字符串的。你可能无法用各种语言实现这些解决方案。如果您需要使用基于比特的算法,只需将二进制数从0增加到 2 ^ N-1 ,然后对每个二进制文件执行 OR 操作。 (等于没有正则表达式的解决方案#1)