Что делает “NSBinarySearchingFirstEqual = (1UL <<8)”, означают в определении перечисления?

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

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

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

6
задан Li Fumin 4 June 2010 в 03:45
поделиться

2 ответа

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

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

Параметры могут быть объединены следующим образом:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual;

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

9
ответ дан 8 December 2019 в 17:18
поделиться

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

Например, предположим, что это 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.

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

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

5
ответ дан 8 December 2019 в 17:18
поделиться