Algorithm 以尽可能快的方式生成所有n位二进制数
如何生成n位字符串的所有可能组合?我需要以最快的方式生成20位字符串的所有组合。(我当前的实现是通过按位和右移操作完成的,但我正在寻找一种更快的技术) 我需要将相应的十进制数的位字符串存储在数组(或列表)中,如--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
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);
}
}