如何在C / Objective C中实现位数组

时间:2010-09-19 02:29:00

标签: objective-c c ios core-foundation bitarray

iOS / Objective-C:我有一大堆布尔值。

这是存储这些值的低效方法 - 当只需要一个元素时,每个元素至少使用8位。

如何优化?

5 个答案:

答案 0 :(得分:15)

请参阅CFMutableBitVector / CFBitVector以获取CFType选项

答案 1 :(得分:11)

试试这个:

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

答案 2 :(得分:6)

使用按位逻辑运算和位移。 (谷歌搜索这些术语可能会给你一些例子。)

基本上你声明一个整数类型(包括intchar等),然后你将整数值“移位”到你想要的位,然后你用一个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数组使用更少的内存...但是......编译器生成的用于访问这些位的代码将更大更慢。因此,除非您有大量需要包含这些位数组的对象,否则它可能会对速度和内存使用产生净负面影响。

答案 3 :(得分:2)

#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)))))

答案 4 :(得分:0)

我遇到了这个问题,因为我正在编写一个数组框架,旨在管理类似于Java BitSet的大量“位”。我想看看我决定的名字是否与其他Objective-C框架冲突。

无论如何,我刚刚开始这个,并决定是否将它发布在SourceForge或其他开源托管网站上。

如果您有兴趣,请告诉我

编辑:我在SourceForge上创建了名为BitArray的项目。源位于SF SVN存储库中,我还上传了一个编译框架。这个LINK会让你的到来。