Algorithm 以尽可能快的方式生成所有n位二进制数

Algorithm 以尽可能快的方式生成所有n位二进制数,algorithm,bitstring,Algorithm,Bitstring,如何生成n位字符串的所有可能组合?我需要以最快的方式生成20位字符串的所有组合。(我当前的实现是通过按位和右移操作完成的,但我正在寻找一种更快的技术) 我需要将相应的十进制数的位字符串存储在数组(或列表)中,如-- 0-->0 1-->0 0 1 2-->0 1 0。。。等等 有什么想法吗?只需输出从0到2^n-1的数字,以二进制表示,精确为n位。表示(i=0;in) 返回; 如果(开始==n) { 对于(int i=0;i

如何生成n位字符串的所有可能组合?我需要以最快的方式生成20位字符串的所有组合。(我当前的实现是通过按位和右移操作完成的,但我正在寻找一种更快的技术)

我需要将相应的十进制数的位字符串存储在数组(或列表)中,如--

0-->0

1-->0 0 1

2-->0 1 0
。。。等等


有什么想法吗?

只需输出从0到2^n-1的数字,以二进制表示,精确为n位。

表示(i=0;i<1048576;i++){
for (i = 0; i < 1048576; i++) {
   printf('%d', i);
}
printf(“%d”,i); }
将int version i转换为二进制字符串,作为OP的练习

for (unsigned long i = 0; i < (1<<20); ++i) {
    // do something with it
}
我只从1个循环增加到了2个循环,但从位到字符的转换比以前多了50%。您可以尝试以下方法:

  • 使用更多的循环
  • 不均匀地分割环,可能是15-5而不是10-10
  • 编写一个函数,该函数接受一串0和1,并向其中添加1。这很容易:找到最后一个
    '0'
    ,将其更改为
    '1'
    ,并将其后面的所有
    '1'
    更改为
    '0'
要彻底优化
写入位字符串
,4的倍数是很好的,因为在大多数体系结构中,您可以在一次字写入中一次写入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)];
}
const uint32\u t little\u endian\u查找={

('0'此解决方案是用Python编写的。(版本2.7和3.x应该可以使用)

它找到最大数字的宽度,然后将整数与二进制格式的整数配对,如果需要,每个格式化字符串都用零右键填充,以填充最大宽度。(pprint内容只是为了获得本论坛的整洁打印输出,可以省略)。

Python

>> 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的所有整数来实现

static int[]res;
静态int n;
静态void Main(字符串[]参数)
{
n=Convert.ToInt32(Console.ReadLine());
res=新整数[n];
生成(0);
}
静态void生成(int开始)
{
如果(开始>n)
返回;
如果(开始==n)
{
对于(int i=0;i
您为什么要这些1048576 20位(二进制表示法)数字?或者如果不是,什么是“20位字符串”?您是否在询问如何打印二进制表示法?即,将数字转换为“1”和“0”的字符串字符?@phkahler:谢谢,没错,我需要将它们存储为每个十进制数的1和0的列表。如果你需要生成20个非常可预测的字符串的2次方,我的蜘蛛感觉开始刺痛,它告诉我也许你根本不需要它们。你打算用它们做什么?也许可以用整数本身而不是它们的字符串表示法来解决这个问题?任何解释都很好
>>> 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')]
>>> 
>> 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']
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);
        }
    }