iOS / Objective-C:我有一大堆布尔值。
这是存储这些值的低效方法 - 当只需要一个元素时,每个元素至少使用8位。
如何优化?
答案 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)
使用按位逻辑运算和位移。 (谷歌搜索这些术语可能会给你一些例子。)
基本上你声明一个整数类型(包括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);
}
请注意,这提供了常量大小(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会让你的到来。