iOS/Objective-C: У меня есть большой массив булевых значений.
Это неэффективный способ хранения этих значений - по крайней мере восемь бит используются для каждого элемента, когда требуется только один.
Как я могу оптимизировать?
iOS/Objective-C: У меня есть большой массив булевых значений.
Это неэффективный способ хранения этих значений - по крайней мере восемь бит используются для каждого элемента, когда требуется только один.
Как я могу оптимизировать?
см. CFMutableBitVector/CFBitVector для опции CFType
Попробуйте следующее:
#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 */
и др.
Используются побитовые логические операции и бит-сдвиг. (Поиск 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
массивы... ОДНАКО... Код, который генерирует компилятор для доступа к этим битам, будет больше и медленнее. Поэтому, если у вас нет большого количества объектов, которые должны содержать эти бит-массивы, это может иметь отрицательное отрицательное влияние на скорость и использование памяти.
#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)))))
Я столкнулся с этим вопросом, так как я пишу бит структуры массива, который намерен управлять большими объемами "бит", аналогичными Java BitSet. Я хотел посмотреть, не изменилось ли название, которое я решил, в конфликте с другими инфраструктурами Objective-C.
В любом случае, я только начинаю это и решаю, размещать его на SourceForge или других сайтах с открытым исходным кодом.
Сообщите мне, если вы заинтересованы
Изменить: я создал проект, называемый BitArray, на SourceForge. Источник находится в репозитории SF SVN, и я также загрузил скомпилированную фреймворк. Этот LINK получит ваше сообщение.