给出二进制数, 什么算法可以找到所有匹配的二进制数,其中所有的1都对应于给定的数字。
例如: 输入:10010 输出:[10010,10011,10110,10111,11010,11011,11110,11111]
答案 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}。
强制它并获取2 ^ n个二进制数,其中n是数字的大小。只保留符合您模式的那些。
同样,你想保持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)