Все двоичные перестановки фиксированной длины в C

#c #arrays #binary

#c #массивы #двоичный

Вопрос:

Я искал по этой теме, но не смог найти. Проблема в том, что для заданного целого числа n сгенерируйте массив, содержащий все 2^n комбинации 0 и 1 .

Например, когда n = 2 , мы должны получить {{0, 0}, {0, 1}, {1, 0}, {1, 1 }} . Я обнаружил, что itertools.product это Python делается с помощью параметра repeat (но мой работодатель хочет, чтобы он был строго C включен).

Мне нужно, чтобы код подходил для n = 24, 25 случаев (и был достаточно быстрым — это требование моего работодателя).

Кроме того, у меня есть еще один вопрос. Есть ли C что-нибудь похожее на Generator in Python ?

Редактировать

Я вижу здесь много отзывов. Я действительно сожалею об этой путанице. Здесь я пытаюсь переформулировать свой вопрос:

У меня есть массив 160 элементов, из которых помечены только 24 (или 25 ) (индексы этих помеченных элементов хранятся в отдельном массиве). Мне нужно брать все 160 элементы 2^24 раз — каждый раз, когда один или несколько отмеченных элементов будут заменены его двойными, и выполнять некоторую операцию (эта операция принимает 160 элементы и каждый раз выдает двоичный ответ, и мне нужен XOR всех ответов). Как я могу эффективно это сделать?

Менеджер фермы, на которой я работаю, не знает ничего, кроме C . Итак, он хочет, чтобы это было сделано C в.

* Каждый элемент представляет собой 2D-массив.

РЕДАКТИРОВАТЬ # 2

Может быть, я все еще не могу прояснить свою проблему, с которой я застрял. Я работаю на основе псевдокода:

 all_elements = { <collection of elements> };
all_marked_elements = { <collection of 24 marked elements> };
all_combinations = { <all 0, 1 combinations of length 2^24> };

int operation (<160 elements>) {
    ...
    return 0 or 1;
}

x = 0;

foreach (c in all_combinations) {
    e = {};
    for (i >= 0; i <= 23; i=i 1) {
        if (c[i] == 1) {
            append all_marked_elements[i] to e;
        }
    }
    d = get dual of all elements in e; 
    x xor= operation ( <all_elements with e replaced by d>);
}
show x; 
  

Комментарии:

1. Этот вопрос состоит из двух вопросов. И это нехорошо.

2. Вы спрашиваете, как считать в двоичном коде.

3. Интересно, кто этот «работодатель» на самом деле …?

4. @alk: может быть … будущий? звучит как вопрос для собеседования начального уровня (если не домашнее задание) </ ot>

Ответ №1:

на самом деле, вам нужно только искать биты в целом числе. если у вас есть 25 бит, ваши перестановки соответствуют битовым последовательностям всех чисел 0<= i < 2^25 , что соответствует простому unsigned int . вам не нужно «генерировать» и хранить эти числа, просто используйте их везде, где вам нужны перестановки.

Ответ №2:

Ответ выглядит следующим образом.

  1. В C естественным способом обработки массива [0,1] является обработка их как битов.
  2. 2 ^ 24 перестановки по 24 бита — это точно значения unsigned int от 0 до 2 ^ 24-1 .
  3. Итак, вопрос, по сути, заключается в том, как написать код на основе этой структуры данных.

Что-то вроде этого.

 int all_elements[160] = { ??? };
int all_marked_elements[24] = { ??? };
unsigned combo;
for (combo = 0; combo < 0x1000000;   combo) {
  /* you probably want to take a copy of all_elements here */
  for (i = 0; i < 23;   i) {
    unsigned bit = 1 << i;
    if (combo amp; bit) {
      int marked_element = all_marked_elements[i];
      /* do something I didn't understand, replacing element by its dual */
    }
    /* now call the operation and do something with the result */
  }
}
  

Комментарии:

1. Двойной здесь не имеет значения. И спасибо за понимание моих потребностей (ага!).

2. С удовольствием. Вы получили много отрицательных голосов, которые, я думаю, не были действительно заслуженными, потому что большинство людей не поняли вопроса. Вы получите лучшие ответы, если будете работать над тем, чтобы ваши вопросы были понятнее.

Ответ №3:

 #include<stdio.h>
#include<math.h>
#include<string.h>
main()
{
    int i,n=2;
    char arr[500];
    for(i=0;i<pow(2,n);i  )
        printf("%sn",itoa(i,arr,2));
}
  

Комментарии:

1. Зачем преобразование в символьное представление?