“NSBinarySearchingFirstEqual =(1UL<< 8)”在枚举定义中的含义是什么?

时间:2010-06-04 03:45:19

标签: objective-c cocoa macos

我在框架目录中的NSArray.h头文件中看到了这个:

enum {
    NSBinarySearchingFirstEqual = (1UL << 8),
    NSBinarySearchingLastEqual = (1UL << 9),
    NSBinarySearchingInsertionIndex = (1UL << 10),
};
typedef NSUInteger NSBinarySearchingOptions;

“NSBinarySearchingFirstEqual =(1UL&lt;&lt; 8)”有什么意义?这个枚举与“NSBinarySearchingOptions”类型定义之间的关系是什么?感谢。

2 个答案:

答案 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位。这两位对应NSBinarySearchingFirstEqualNSBinarySearchingInsertionIndex

如果您不熟悉位移,请查看Wikipedia article,其中包含一些有用的图表。

类型定义表示NSBinarySearchingOption的类型为NSUInteger。本质上它们是相同的东西,但是通过定义一个不同的类型,它会更清楚地为接受这种类型的参数的方法提供什么样的值。