如何在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的无符号整数元素数组, BITOPmacros可以以位数组的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(包括intchar等),然后你“移”整数值到你想要的位,然后你做一个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仓库中,我也上传了一个编译框架。 这个链接将得到你的。

  • 坦率