如何生成n位字符串的所有可能的组合? 我需要生成一个可能的最快的方式20位字符串的所有组合。 (我目前的执行与位与和右移位操作完成,但我正在寻找更快的技术)。
我需要的比特串存储在用于相应的十进制数的阵列(或列表),类似 -
0 --> 0 0 0
1 --> 0 0 1
2 --> 0 1 0
...等
任何的想法?
如何生成n位字符串的所有可能的组合? 我需要生成一个可能的最快的方式20位字符串的所有组合。 (我目前的执行与位与和右移位操作完成,但我正在寻找更快的技术)。
我需要的比特串存储在用于相应的十进制数的阵列(或列表),类似 -
0 --> 0 0 0
1 --> 0 0 1
2 --> 0 1 0
...等
任何的想法?
for (unsigned long i = 0; i < (1<<20); ++i) {
// do something with it
}
一个unsigned long
是比特序列。
如果你想要的是一个字符的字符串'0'
和'1'
,那么你可以转换i
每次到该格式。 你也许能够得到加速采取的事实,连续数通常有着漫长的初始子的优势。 所以,你可以做这样的事情:
char bitstring[21];
for (unsigned int i = 0; i < (1<<10); ++i) {
write_bitstring10(i, bitstring);
for (unsigned int j = 0; j < (1<<10); ++j) {
write_bitstring10(j, bitstring + 10);
// do something with bitstring
}
}
我只从1环上升至2,但我确实有点超过了50%,从位之多转换成字符如前。 你可以通过下面的试验:
'0'
,将其更改为'1'
,并改变所有的'1'
后s到'0'
。 为了恶魔般优化write_bitstring
,为4的倍数是一件好事,因为在大多数系统架构,你可以在一个字写入时间的blit 4个字符:
开始:
assert(CHAR_BIT == 8);
uint32_t bitstring[21 / 4]; // not char array, we need to ensure alignment
((char*)bitstring)[20] = 0; // nul terminate
函数的定义:
const uint32_t little_endian_lookup = {
('0' << 24) | ('0' << 16) | ('0' << 8) | ('0' << 0),
('1' << 24) | ('0' << 16) | ('0' << 8) | ('0' << 0),
('1' << 24) | ('1' << 16) | ('0' << 8) | ('0' << 0),
// etc.
};
// might need big-endian version too
#define lookup little_endian_lookup // example of configuration
void write_bitstring20(unsigned long value, uint32_t *dst) {
dst[0] = lookup[(value & 0xF0000) >> 16];
dst[1] = lookup[(value & 0x0F000) >> 12];
dst[2] = lookup[(value & 0x00F00) >> 8];
dst[3] = lookup[(value & 0x000F0) >> 4];
dst[4] = lookup[(value & 0x0000F)];
}
我没有测试过任何这:显然你是负责编写一个基准,你可以用它来进行实验。
蟒蛇
>> n = 3
>> l = [bin(x)[2:].rjust(n, '0') for x in range(2**n)]
>> print l
['000', '001', '010', '011', '100', '101', '110', '111']
从0到2 ^ n的只是输出号码 - 在二进制表示1与恰好n位数字。
for (i = 0; i < 1048576; i++) {
printf('%d', i);
}
我整型版本的二进制字符串转换留给一个练习OP。
该解决方案是在Python。 (版本2.7和3.x应该工作)
>>> from pprint import pprint as pp
>>> def int2bits(n):
return [(i, '{i:0>{n}b}'.format(i=i, n=n)) for i in range(2**n)]
>>> pp(int2bits(n=4))
[(0, '0000'),
(1, '0001'),
(2, '0010'),
(3, '0011'),
(4, '0100'),
(5, '0101'),
(6, '0110'),
(7, '0111'),
(8, '1000'),
(9, '1001'),
(10, '1010'),
(11, '1011'),
(12, '1100'),
(13, '1101'),
(14, '1110'),
(15, '1111')]
>>>
它发现的最大数量的宽度,然后对以二进制格式与每一个格式化字符串是右补齐零的如果需要的话,以填补最大宽度的int INT。 (该pprint东西只是为了获得这个论坛一个整洁的打印输出,并可能被排除在外)。
你能做到通过产生在二进制表示所有整数0至2 ^ N-1
static int[] res;
static int n;
static void Main(string[] args)
{
n = Convert.ToInt32(Console.ReadLine());
res = new int [n];
Generate(0);
}
static void Generate(int start)
{
if (start > n)
return;
if(start == n)
{
for(int i=0; i < start; i++)
{
Console.Write(res[i] + " ");
}
Console.WriteLine();
}
for(int i=0; i< 2; i++)
{
res[start] = i;
Generate(start + 1);
}
}