12

iOS / Objective-C:我有大量的布尔值。

这是存储这些值的一种低效方式——当只需要一个时,每个元素至少使用八位。

我该如何优化?

4

5 回答 5

17

有关 CFType 选项,请参阅 CFMutableBitVector/CFBitVector

于 2010-09-19T02:55:37.787 回答
11

试试这个:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))

然后对于任何不大于 的无符号整数元素数组size_tBITOP宏可以将数组作为位数组访问。例如:

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

等等

于 2010-09-19T16:30:29.600 回答
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数组使用更少的内存......但是......编译器生成的用于访问这些位的代码将更大且更慢。因此,除非您有大量需要包含这些位数组的对象,否则它可能会对速度和内存使用产生负面影响。

于 2010-09-19T02:39:05.857 回答
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)))))
于 2012-11-01T20:16:56.387 回答
0

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

无论如何,我才刚刚开始,并且正在决定是否将其发布在 SourceForge 或其他开源托管站点上。

如果您有兴趣,请告诉我

编辑:我在 SourceForge 上创建了名为 BitArray 的项目。源代码在 SF SVN 存储库中,我还上传了一个已编译的框架。此链接将带您到那里。

  • 坦率
于 2011-01-04T11:11:54.500 回答