Если вы хотите инициализировать ваше битовое поле нулевым значением, calloc()
может быть предпочтительнее, чем malloc()
;вам, вероятно, также следует использовать тип без знака, чтобы избежать сдвигов со знаком при переворачивании битов.
#include <limits.h>
const size_t BITS_PER_BLOCK = sizeof (long long) * CHAR_BIT;
size_t count = bits / BITS_PER_BLOCK + !!(bits % BITS_PER_BLOCK);
unsigned long long *blocks = calloc(count, sizeof *blocks);
!!
- довольно хакерский способ преобразования ненулевых значений в 1
, что часто встречается в Cи используется здесь для выделения дополнительного блока, если количество битов не делится на BITS_PER_BLOCK
.
Вы также можете получить необходимое количество блоков (как - среди прочего - Ларс указал в комментариях к другомуответ) через
size_t count = (bits + BITS_PER_BLOCK - 1) / BITS_PER_BLOCK;
Я нахожу предыдущую версию более читабельной, но поскольку последняя также довольно распространена - это особый случай более общего алгоритма округления, использующего целочисленную арифметику - программисту на Си должно быть удобнолюбой выбор.