2009-11-22 140 views
0

我正在写一个iPhone应用程序,它是Objective-C和C的混合体。我在整个代码中只有两个不同的值:0和1的32位整数标志。我想使用数据类型小于32位。如何在我的iPhone应用程序中使用位类型?

有没有一种类型只有一个位? Objective-C中“BOOL”的大小是多少?

一个解决方案,我考虑的是使用一个32位整数的一组32个国旗...然后检查下列方式每个标志:

if(ALL_FLAGS & (1 << SPECIFIC_FLAG)){...} 

我真的很想只使用一个“比特”类型。

干杯!

+0

为什么不使用32位类型? – 2009-11-23 01:26:27

回答

4

目标C下的BOOL类型(实际上它是一个Cocoa定义,OBJC本身不知道BOOL类型)正在使用一个字节。这与Windows 32 BOOL不同,后者相当于int或32位。

对于较小的类型,可以使用典型的C/C++方法,无论是像上面的示例中的位移或位结构(在这种情况下编译器将执行位移和测试)。

typedef struct { 
    unsigned someflag:1; 
    unsigned anotherflag:1; 
    unsigned yetnoather:1; 
} MYFLAGS ; 


MYFLAGS allflags; 

allflags.anotherflag= TRUE; 

if (allflags.anotherflag) { /* somecode */ } 
+0

+1,但是'TRUE'的定义从哪里来?如果包含'stdbool.h',标准C使用'0'和'1'(实际上任何'!= 0'都被认为是真的)或者'true'和'false'; afaik Objective C使用'YES'和'NO';只是为了更进一步的混淆:在CFBase.h中C99布尔类型被称为'_Bool' – Christoph 2009-11-22 21:41:48

+1

:'#define TRUE 1' – cobbal 2009-11-22 21:50:27

+0

虽然这个构造仍然不会被编译器填充到大于3位的东西,但是使整个锻炼有点可疑。 – Fred 2009-11-22 22:05:07

3

还有一个CFBitVector,在其中可容纳值的集合......

1

下面是对BOOL类型的定义,你可以以同样的方式定义自己的类型:

typedef signed char  BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used. 
#define OBJC_BOOL_DEFINED 


#define YES    (BOOL)1 
#define NO    (BOOL)0 
相关问题