如何生成所有可能的组合n位字符串?

时间:2012-03-19 08:58:42

标签: matlab bit-manipulation

给定正整数n,我想在matlab中生成所有可能的n位组合 例如:如果n = 3,那么答案应该是

000
001
010
011
100
101
110
111

我该怎么办? 我想将它们存储在矩阵中。我试过了

for n=1:2^4 
r(n)=dec2bin(n,5); 
end; 

但错误“在作业A(:) = B中,A和B中的元素数必须相同。

3 个答案:

答案 0 :(得分:9)

只需遍历[0,2^n)中的所有整数,并将数字打印为二进制。如果您始终希望拥有n位数(例如插入前导零),则可能如下所示:

for ii=0:2^n-1,
    fprintf('%0*s\n', n, dec2bin(ii));
end

编辑:有多种方法可以将结果放入矩阵中。最简单的是使用

x = dec2bin(0:2^n-1);

将生成类型为n的{​​{1}} - 2^n矩阵。每行都是一个位串。

如果你真的想在每一行存储字符串,你可以这样做:

char

但是,如果您正在寻找有效的处理,您应该记住整数已经以二进制形式存储在内存中!所以,矢量:

x = cell(1, 2^n);
for ii=0:2^n-1,
    x{ii} = dec2bin(ii);
end

以最高内存效率和CPU效率的方式包含二进制模式。唯一的权衡是,使用这种紧凑的表示法,你将无法用超过32位的64位表示模式。

答案 1 :(得分:1)

这是对该问题的单行答案,该问题为您提供了所有bitCombs = dec2bin(0:2^n-1) - '0'位组合的双数组:

{{1}}

答案 2 :(得分:0)

这么多方法可以做到这种排列。如果您希望使用数组计数器实现:为三个位置(2 ^ 0,2 ^ 1,2 ^ 2)中的每一个设置一个从0到1的计数器数组。让起始编号为000(存储在数组中)。使用计数器并增加其第一位(2 ^ 0)。数字将为001.将计数器重置在位置(2 ^ 0)并将计数器增加到2 ^ 1并继续循环,直到您完成所有计数器。