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

P i*_*P i 12 c objective-c core-foundation bitarray ios

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

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

我该如何优化?

jus*_*tin 16

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

  • @whitman将值作为CFBit传递; 这并不意味着它们被*存储*.我只看了CFBitVector的实现(r.550.13).内存消耗是一位,而分配大小则四舍五入到可被64整除的数字.这是一个非常保守的实现. (8认同)
  • http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFBitVectorRef/Reference/reference.html (2认同)

R..*_*R.. 11

试试这个:

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

然后,对于任何不大于的无符号整数元素数组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 */
Run Code Online (Sandbox Code Playgroud)

等等


asv*_*kau 6

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

基本上你声明一个整数类型(包括int,char等),然后你将整数值"移位"到你想要的位,然后你用整数做一个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);
}
Run Code Online (Sandbox Code Playgroud)

注意,这提供了恒定大小(sizeof(int) * 8位)的"位阵列" .也许这对你来说没问题,或者你可能想要在此基础上构建一些东西.(或者重复使用某些库提供的内容.)

这将使用比bool数组更少的内存...但是......编译器生成的用于访问这些位的代码将更大更慢.因此,除非您有大量需要包含这些位数组的对象,否则它可能会对速度和内存使用产生净负面影响.

  • 问题是关于C.提问者可能甚至不知道参考是什么.如果是这种情况,你没有分心,你的注意力更多. (4认同)
  • @JeremyP - 无论如何这是一个说明性的例子.我决定使用引用而不是指针,因为我认为它会从被问到的问题中分散注意力.我认为这一点很好,答案并不是要复制粘贴到别人的解决方案中. (2认同)