如何在C / Objective C中实现位数组
iOS / Objective-C:我有一个大数组布尔值。
这是存储这些值的低效方式 – 当只需要一个元素时,每个元素至less使用八位。
我怎样才能优化?
有关CFType选项,请参阅CFMutableBitVector / CFBitVector
尝试这个:
#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
macros可以以位数组的forms访问数组。 例如:
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 */
等等
您使用按位逻辑操作和位移。 (谷歌search这些条款可能会给你一些例子。)
基本上,你声明一个整数types(包括int
, char
等),然后你“移”整数值到你想要的位,然后你做一个OR或与整数。
一些快速说明的例子(在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
位)。 也许这对你是好的,或者你会想要build立在这之上的东西。 (或重新使用任何一个图书馆提供的。)
这将使用bool
数组less的内存…但是…编译器生成访问这些位的代码会更大,更慢。 所以除非你有大量需要包含这些位数组的对象,否则它可能会对速度和内存使用率产生负面影响。
#define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
不pipe用 …
固定:
#define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))
当我正在写一个位数组框架时,我遇到了这个问题,这个框架有意pipe理大量类似于Java BitSet的“位”。 我期待着看看我决定的名字是否与其他Objective-C框架相冲突。
无论如何,我只是开始这个,并决定是否将其张贴在SourceForge或其他开源托pipe网站。
让我知道如果你有兴趣
编辑:我已经在SourceForge上创build了名为BitArray的项目。 源代码在SF SVN仓库中,我也上传了一个编译框架。 这个链接将得到你的。
- 坦率