2010-06-04 11 views
6

Widziałem to w pliku nagłówka NSArray.h w katalogu ramowej:Co oznacza "NSBinarySearchingFirstEqual = (1UL << 8)" w definicji wyliczenia?

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

Jaki jest sens „NSBinarySearchingFirstEqual = (1UL < < 8)” i jaka jest relacja między tym wyliczeniem i „NSBinarySearchingOptions”? definicja typu? Dzięki.

Odpowiedz

9

"NSBinarySearchingFirstEqual = (1UL < < 8)" przypisać określone wartości do stałych wyliczeniowych. Wartości są wybierane tak, aby były reprezentowane przez pojedynczy bit, umożliwiając łączenie opcji z operacjami bitowymi. Operator "< <" jest lewą zmianą; można równoważnie napisać to jako:

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

opcje można łączyć jak:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual; 

Zauważ, że NSBinarySearchingOptions jest typedef'd aby liczba całkowita bez znaku, a nie wyliczenia, ponieważ może zawierać wartości, które są nie jest jedną ze zdefiniowanych wartości wyliczenia (gdy połączonych jest wiele wartości).

+0

"Jeśli podasz NSBinarySearchingFirstEqual i NSBinarySearchingLastEqual, zgłasza wyjątek NSInvalidArgumentException" - z dokumentu SDK. –

5

Zazwyczaj ten rodzaj definicji enum wskazuje, że jest to bit mask. Każdy element wyliczenia ma unikalną wartość, ale ma tylko jeden zestaw bitów, co oznacza, że ​​po połączeniu wielu wartości nadal można określić, które z nich zostały dostarczone, po prostu patrząc, które bity są ustawione.

Na przykład załóżmy, że to 32-bitową liczbę całkowitą przedstawioną w Binary

0000 0000 0000 0000 0000 0001 0000 0000 

8th bit jest ustawiony, co odpowiada wartości wyliczeniowego NSBinarySearchingFirstEqual, ponieważ wartość 1 przesunięty 8 bitów w lewo kończy będąc 8. bit (zakładając, że zamówić bity od 0)

0000 0000 0000 0000 0000 0101 0000 0000 

Ta poprzednia wersja 32-bitowa liczba całkowita ma 2 bity, które są ustawione, 8. i 10.. Te dwa bity odpowiadają NSBinarySearchingFirstEqual i NSBinarySearchingInsertionIndex.

Jeśli nie masz doświadczenia z przeniesieniem bitów, przejrzyj Wikipedia article, który zawiera przydatne diagramy.

Definicja typu oznacza, że ​​NSBinarySearchingOption jest typu NSUInteger. Zasadniczo są one tym samym, ale definiując inny typ, staje się jaśniejsze, jaki rodzaj wartości należy podać dla metody, która przyjmuje argument tego typu.