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

Li *_*min 6 macos cocoa objective-c

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

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

什么是点"NSBinarySearchingFirstEqual =(1UL << 8)"?什么是此枚举和"NSBinarySearchingOptions"类型定义之间的关系?谢谢.

Dav*_*har 9

"NSBinarySearchingFirstEqual =(1UL << 8)"等将特定值分配给枚举常量.选择这些值以便它们由单个位表示,允许选项与按位运算组合."<<"运算符是左移; 你可以等同地把它写成:

enum {
    NSBinarySearchingFirstEqual = 256,
    NSBinarySearchingLastEqual = 512,
    NSBinarySearchingInsertionIndex = 1024,
};
Run Code Online (Sandbox Code Playgroud)

选项可以组合如下:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual;
Run Code Online (Sandbox Code Playgroud)

请注意,NSBinarySearchingOptionstypedef为无符号整数,而不是枚举,因为它可以包含不是定义的枚举值之一的值(当组合多个值时).


dre*_*lax 5

通常这种enum定义表明它是一个掩码.枚举的每个成员都有一个唯一值,但也只有一个位设置,这意味着当您组合多个值时,您仍然可以通过查看设置的位来确定提供了哪些值.

例如,假设这个以二进制表示的32位整数:

0000 0000 0000 0000 0000 0001 0000 0000
Run Code Online (Sandbox Code Playgroud)

第8位置位,对应于枚举值NSBinarySearchingFirstEqual,因为值1向左移位8位最终为第8位(假设您从0开始对位进行排序)

0000 0000 0000 0000 0000 0101 0000 0000
Run Code Online (Sandbox Code Playgroud)

之前的32位整数有2位被设置,即第8位和第10位.这两个位对应于NSBinarySearchingFirstEqualNSBinarySearchingInsertionIndex.

如果您不熟悉位移,请查看维基百科文章,其中包含一些有用的图表.

类型定义意味着a NSBinarySearchingOption是类型NSUInteger.本质上它们是相同的东西,但是通过定义不同的类型,可以更清楚地知道为接受这种类型的参数的方法提供什么样的值.