#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:
Ответ выглядит следующим образом.
- В C естественным способом обработки массива [0,1] является обработка их как битов.
- 2 ^ 24 перестановки по 24 бита — это точно значения unsigned int от 0 до 2 ^ 24-1 .
- Итак, вопрос, по сути, заключается в том, как написать код на основе этой структуры данных.
Что-то вроде этого.
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. Зачем преобразование в символьное представление?