Что означает «NSBinarySearchingFirstEqual = (1UL << 8)» в определении перечисления? - PullRequest
6 голосов
/ 04 июня 2010

Я видел это в заголовочном файле NSArray.h в каталоге framework:

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

Какой смысл в «NSBinarySearchingFirstEqual = (1UL << 8)»? И какова связь между этим перечислением и определением типа «NSBinarySearchingOptions»? Спасибо. </p>

Ответы [ 2 ]

9 голосов
/ 04 июня 2010

«NSBinarySearchingFirstEqual = (1UL << 8)» и т. Д. Присваивают конкретные значения константе перечисления. Значения выбираются так, чтобы они были представлены одним битом, позволяя сочетать опции с побитовыми операциями. Оператор «<<» - это сдвиг влево; Вы могли бы эквивалентно написать это как: </p>

enum {
    NSBinarySearchingFirstEqual = 256,
    NSBinarySearchingLastEqual = 512,
    NSBinarySearchingInsertionIndex = 1024,
};

Опции можно комбинировать как:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual;

Обратите внимание, что NSBinarySearchingOptions является typedef'd для целого числа без знака, а не для enum, поскольку оно может содержать значения, которые не являются одним из определенных значений перечисления (когда объединяются несколько значений).

5 голосов
/ 04 июня 2010

Обычно такое определение enum указывает, что это битовая маска . Каждый член перечисления имеет уникальное значение, но также имеет только один установленный бит, а это означает, что при объединении нескольких значений вы все равно сможете определить, какие из них были предоставлены, просто посмотрев, какие биты установлены.

Например, предположим, что это 32-разрядное целое число, представленное в двоичном виде:

0000 0000 0000 0000 0000 0001 0000 0000

Устанавливается 8-й бит, который соответствует значению enum NSBinarySearchingFirstEqual, поскольку значение 1, сдвинутое на 8 бит влево, в конечном итоге становится 8-м битом (при условии, что вы упорядочиваете биты с 0)

0000 0000 0000 0000 0000 0101 0000 0000

Это предыдущее 32-разрядное целое число имеет 2 установленных бита: 8-й и 10-й. Эти два бита соответствуют NSBinarySearchingFirstEqual и NSBinarySearchingInsertionIndex.

Если вы не знакомы со сдвигом битов, взгляните на статью Википедии , в которой есть несколько полезных диаграмм.

Определение типа означает, что NSBinarySearchingOption имеет тип NSUInteger. По сути, это одно и то же, но определив другой тип, становится понятнее, какие значения следует предоставлять методу, который принимает аргумент этого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...