Подтвердить что ты не робот

Как реализовать бит-массив в C/Objective C

iOS/Objective-C: У меня есть большой массив булевых значений.

Это неэффективный способ хранения этих значений - по крайней мере восемь бит используются для каждого элемента, когда требуется только один.

Как я могу оптимизировать?

4b9b3361

Ответ 1

см. CFMutableBitVector/CFBitVector для опции CFType

Ответ 2

Попробуйте следующее:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))

Затем для любого массива беззнаковых целочисленных элементов не более size_t макрос BITOP может получить доступ к массиву в виде битового массива. Например:

unsigned char array[16] = {0};
BITOP(array, 40, |=); /* sets bit 40 */
BITOP(array, 41, ^=); /* toggles bit 41 */
if (BITOP(array, 42, &)) return 0; /* tests bit 42 */
BITOP(array, 43, &=~); /* clears bit 43 */

и др.

Ответ 3

Используются побитовые логические операции и бит-сдвиг. (Поиск Google этих терминов может дать вам несколько примеров.)

В основном вы объявляете целочисленный тип (включая int, char и т.д.), затем вы меняете целочисленные значения на бит, который хотите, тогда вы делаете OR или AND с целым числом.

Некоторые быстрые иллюстративные примеры (на С++):

inline bool bit_is_on(int bit_array, int bit_number)
{
   return ((bit_array) & (1 << bit_number)) ? true : false;
}

inline void set_bit(int &bit_array, int bit_number)
{
   bit_array |= (1 << bit_number);
}

inline void clear_bit(int &bit_array, int bit_number)
{
   bit_array &= ~(1 << bit_number);
}

Обратите внимание, что это обеспечивает "бит-массивы" постоянного размера (sizeof(int) * 8 bits). Может быть, это хорошо для вас, или, может быть, вам захочется построить что-то поверх этого. (Или повторно использовать то, что предоставляет какая-то библиотека.)

Это будет использовать меньше памяти, чем bool массивы... ОДНАКО... Код, который генерирует компилятор для доступа к этим битам, будет больше и медленнее. Поэтому, если у вас нет большого количества объектов, которые должны содержать эти бит-массивы, это может иметь отрицательное отрицательное влияние на скорость и использование памяти.

Ответ 4

#define BITOP(a,b,op) \
   ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

не будет работать...

Fix:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))

Ответ 5

Я столкнулся с этим вопросом, так как я пишу бит структуры массива, который намерен управлять большими объемами "бит", аналогичными Java BitSet. Я хотел посмотреть, не изменилось ли название, которое я решил, в конфликте с другими инфраструктурами Objective-C.

В любом случае, я только начинаю это и решаю, размещать его на SourceForge или других сайтах с открытым исходным кодом.

Сообщите мне, если вы заинтересованы

Изменить: я создал проект, называемый BitArray, на SourceForge. Источник находится в репозитории SF SVN, и я также загрузил скомпилированную фреймворк. Этот LINK получит ваше сообщение.

  • Frank