2010-06-04 10 views
6

vi esto en el archivo de cabecera NSArray.h en el directorio de marco:¿Qué significa "NSBinarySearchingFirstEqual = (1UL << 8)" en una definición de enumeración?

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

Cuál es el punto de "NSBinarySearchingFirstEqual = (1UL < < 8)" Y ¿cuál es la relación entre esta enumeración y los "NSBinarySearchingOptions"? tipo-definición? Gracias.

Respuesta

9

El "NSBinarySearchingFirstEqual = (1UL < < 8)" etc. asigna valores específicos a las constantes de enumeración. Los valores se eligen de modo que estén representados por un solo bit, lo que permite que las opciones se combinen con operaciones bit a bit. El operador "< <" es un desplazamiento a la izquierda; usted podría escribir esto como lo que es equivalente:

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

opciones pueden combinarse como:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual; 

Tenga en cuenta que se NSBinarySearchingOptions typedef'd a un entero sin signo, no la enumeración, ya que puede contener valores que son no es uno de los valores enum definidos (cuando se combinan varios valores).

+0

"Si especifica tanto NSBinarySearchingFirstEqual como NSBinarySearchingLastEqual, arroja una NSInvalidArgumentException" - del documento SDK. –

5

Por lo general, ese tipo de enum definición indica que es un bit mask. Cada miembro de la enumeración tiene un valor único, pero también solo tiene un bit establecido, lo que significa que cuando combina valores múltiples, aún puede determinar cuáles se proporcionaron simplemente observando qué bits se establecen.

Por ejemplo, asumir esta entero de 32 bits representado en binario:

0000 0000 0000 0000 0000 0001 0000 0000 

El octavo bit se fija, que corresponde al valor enum NSBinarySearchingFirstEqual, ya que el valor 1 desplaza 8 bits a la izquierda termina siendo el octavo bit (suponiendo que pide sus bits de 0)

0000 0000 0000 0000 0000 0101 0000 0000 

Este anterior entero de 32 bits tiene 2 bits que están activos, la octava y la décima. Estos dos bits corresponden a NSBinarySearchingFirstEqual y NSBinarySearchingInsertionIndex.

Si no está familiarizado con el cambio de bit, eche un vistazo a Wikipedia article que tiene algunos diagramas útiles.

La definición de tipo significa que un NSBinarySearchingOption es del tipo NSUInteger. Básicamente, son la misma cosa, pero al definir un tipo diferente, se vuelve más claro sobre qué tipo de valores proporcionar a un método que toma un argumento de este tipo.