我在框架目录中的NSArray.h头文件中看到了这个:
enum {
NSBinarySearchingFirstEqual = (1UL << 8),
NSBinarySearchingLastEqual = (1UL << 9),
NSBinarySearchingInsertionIndex = (1UL << 10),
};
typedef NSUInteger NSBinarySearchingOptions;
“NSBinarySearchingFirstEqual =(1UL&lt;&lt; 8)”有什么意义?这个枚举与“NSBinarySearchingOptions”类型定义之间的关系是什么?感谢。
答案 0 :(得分:9)
“NSBinarySearchingFirstEqual =(1UL&lt;&lt; 8)”等将特定值分配给枚举常数。选择这些值以便它们由单个位表示,允许选项与按位运算组合。 “&lt;&lt;&lt;&lt;操作员是左移;你可以将其写成:
enum {
NSBinarySearchingFirstEqual = 256,
NSBinarySearchingLastEqual = 512,
NSBinarySearchingInsertionIndex = 1024,
};
选项可以合并为:
NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual;
请注意NSBinarySearchingOptions
是无符号整数的类型定义,而不是枚举,因为它可以包含不是定义的枚举值之一的值(当组合多个值时)。
答案 1 :(得分:5)
通常那种enum
定义表明它是bit mask。枚举的每个成员都有一个唯一值,但也只有一个位设置,这意味着当您组合多个值时,您仍然可以通过查看设置的位来确定提供了哪些值。
例如,假设这个以二进制表示的32位整数:
0000 0000 0000 0000 0000 0001 0000 0000
第8位置位,对应于枚举值NSBinarySearchingFirstEqual
,因为值1向左移位8位最终为第8位(假设您从0开始对位进行排序)
0000 0000 0000 0000 0000 0101 0000 0000
此前一个32位整数有2位被设置,即第8位和第10位。这两位对应NSBinarySearchingFirstEqual
和NSBinarySearchingInsertionIndex
。
如果您不熟悉位移,请查看Wikipedia article,其中包含一些有用的图表。
类型定义表示NSBinarySearchingOption
的类型为NSUInteger
。本质上它们是相同的东西,但是通过定义一个不同的类型,它会更清楚地为接受这种类型的参数的方法提供什么样的值。