2010-06-04 9 views
6

Ho visto questo nel file di intestazione NSArray.h nella directory quadro:Che cosa significa "NSBinarySearchingFirstEqual = (1UL << 8)" in una definizione di enumerazione?

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

Qual è il punto di "NSBinarySearchingFirstEqual = (1UL < < 8)" E qual è il rapporto tra questa enumerazione e le "NSBinarySearchingOptions"? digitare alta definizione? Grazie.

risposta

9

Il "NSBinarySearchingFirstEqual = (1UL < < 8)" ecc. Assegna valori specifici alle costanti di enumerazione. I valori vengono scelti in modo che siano rappresentati da un singolo bit, consentendo di combinare le opzioni con operazioni bit a bit. L'operatore "< <" è uno spostamento a sinistra; si potrebbe equivalentemente scrivere questo come:

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

opzioni possono essere combinate come:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual; 

noti che NSBinarySearchingOptions è typedef per un intero senza segno, non l'enum, perché può contenere valori che sono non uno dei valori enum definiti (quando si combinano più valori).

+0

"Se si specifica NSBinarySearchingFirstEqual e NSBinarySearchingLastEqual, viene generata una NSInvalidArgumentException" - dal documento SDK. –

5

In genere questo tipo di definizione enum indica che è un bit mask. Ogni membro dell'enumerazione ha un valore univoco, ma ha anche solo un bit impostato, il che significa che quando si combinano più valori, si è ancora in grado di determinare quali sono stati forniti solo osservando quali bit sono impostati.

Ad esempio, assumere tale intero a 32 bit rappresentato in binario:

0000 0000 0000 0000 0000 0001 0000 0000 

Il bit 8 è impostato, che corrisponde al valore di enumerazione NSBinarySearchingFirstEqual, poiché il valore 1 spostato di 8 bit verso sinistra finisce essendo l'8 bit (supponendo che si ordina i bit da 0)

0000 0000 0000 0000 0000 0101 0000 0000 

Questo precedente intero a 32 bit dispone di 2 bit impostati, l'8 e il 10 °. Questi due bit corrispondono a NSBinarySearchingFirstEqual e NSBinarySearchingInsertionIndex.

Se non hai familiarità con lo spostamento dei bit, dai uno sguardo allo Wikipedia article che ha alcuni diagrammi utili.

La definizione del tipo indica che uno NSBinarySearchingOption è di tipo NSUInteger. Essenzialmente sono la stessa cosa, ma definendo un tipo diverso diventa più chiaro su quale tipo di valori fornire a un metodo che accetta un argomento di questo tipo.