Как определить и работать с массивом битов в C?

Я хочу создать очень большой массив, в котором я пишу «0» и «1». Я пытаюсь смоделировать физический процесс, называемый случайной последовательной адсорбцией, где единицы длины 2, димеры, размещаются на n-мерной решетке в случайном месте, не перекрывая друг друга. Процесс останавливается, когда на решетке больше не остается места для размещения большего количества димеров (решетка застряла).

Сначала я начинаю с решетки нулей, а димеры представлены парой единиц. Поскольку каждый димер осажден, сайт слева от димера блокируется из-за того, что димеры не могут перекрываться. Таким образом, я моделирую этот процесс, помещая тройку «1» на решетку. Мне нужно повторить всю симуляцию большое количество раз, а затем определить средний процент покрытия.

Я уже сделал это, используя массив символов для 1D и 2D решеток. Сейчас я пытаюсь сделать код максимально эффективным, прежде чем работать над проблемой 3D и более сложными обобщениями.

Вот как выглядит код в 1D, упрощенно:

int main()
{
    /* Define lattice */
    array = (char*)malloc(N * sizeof(char));

    total_c = 0;

    /* Carry out RSA multiple times */
    for (i = 0; i < 1000; i++)
        rand_seq_ads();

    /* Calculate average coverage efficiency at jamming */
    printf("coverage efficiency = %lf", total_c/1000);

    return 0;
}

void rand_seq_ads()
{
    /* Initialise array, initial conditions */
    memset(a, 0, N * sizeof(char));
    available_sites = N;
    count = 0;

    /* While the lattice still has enough room... */
    while(available_sites != 0)
    {
        /* Generate random site location */
        x = rand();

        /* Deposit dimer (if site is available) */
        if(array[x] == 0)
        {
            array[x] = 1;
            array[x+1] = 1;
            count += 1;
            available_sites += -2;
        }

        /* Mark site left of dimer as unavailable (if its empty) */
        if(array[x-1] == 0)
        {
            array[x-1] = 1;
            available_sites += -1;
        }
    }

    /* Calculate coverage %, and add to total */
    c = count/N
    total_c += c;
}

Для реального проекта, который я делаю, он включает в себя не только димеры, но и тримеры, квадримеры и всевозможные формы и размеры (для 2D и 3D).

Я надеялся, что смогу работать с отдельными битами, а не с байтами, но я много читал и, насколько я могу судить, вы можете изменять только 1 байт за раз, поэтому либо мне нужно выполнить сложную индексацию или есть более простой способ сделать это?

Спасибо за ваши ответы

Ответы на вопрос(5)

Ваш ответ на вопрос