Как реализовать битовый массив в C / Objective C - PullRequest
12 голосов
/ 19 сентября 2010

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

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

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

Ответы [ 5 ]

15 голосов
/ 19 сентября 2010

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

11 голосов
/ 19 сентября 2010

Попробуйте это:

#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 */

и т.д.

6 голосов
/ 19 сентября 2010

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

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

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

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 бит).Может быть, это нормально для вас, или, может быть, вы захотите что-то построить поверх этого.(Или повторно используйте все, что предоставляет некоторая библиотека.)

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

2 голосов
/ 02 ноября 2012
#define BITOP(a,b,op) \
   ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

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

Исправлено:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))
0 голосов
/ 04 января 2011

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

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

Дайте мне знать, если вы заинтересованы

Редактировать: Я создал проект под названием BitArray для SourceForge.Исходный код находится в хранилище SF SVN, и я также загрузил скомпилированный фреймворк.Эта ССЫЛКА доставит вас туда.

  • Фрэнк
...