2010-05-29 27 views
8

Durante la lectura de algunos documentos here, me encontré con esto:OR bit a bit de las constantes

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 

no tengo idea de cómo funciona esto. Leí sobre los operadores bit a bit en C, pero no entiendo cómo se pueden ajustar tres (¡o más!) Constantes dentro de una int y luego ser capaces de extraerlas de alguna manera del int. Excavación de más abajo en la documentación, también encontré esto, lo que probablemente está relacionado:

typedef enum { 
    kCFCalendarUnitEra = (1 << 1), 
    kCFCalendarUnitYear = (1 << 2), 
    kCFCalendarUnitMonth = (1 << 3), 
    kCFCalendarUnitDay = (1 << 4), 
    kCFCalendarUnitHour = (1 << 5), 
    kCFCalendarUnitMinute = (1 << 6), 
    kCFCalendarUnitSecond = (1 << 7), 
    kCFCalendarUnitWeek = (1 << 8), 
    kCFCalendarUnitWeekday = (1 << 9), 
    kCFCalendarUnitWeekdayOrdinal = (1 << 10), 
} CFCalendarUnit; 

¿Cómo funcionan las declaraciones/(1 << 3) variables? Lo siento si esto es trivial, pero ¿podría alguien aclararme al explicar o quizás publicar un enlace a una buena explicación?

+0

Eso parece objetivo-c? ¿Está mal etiquetado? – SoapBox

+0

@SoapBox: El ejemplo de hecho se toma de Cocoa, pero realmente es directo C. – ryyst

+0

Esa segunda línea de código no es C, no por mucho. – SoapBox

Respuesta

9

Básicamente , las constantes se representan con solo un bit, por lo que si tiene un entero de 32 bits, puede incluir 32 constantes en él. Sus constantes tienen que ser potencias de dos, por lo que solo toman un bit "set" para representar.

Por ejemplo:

#define CONSTANT_1 0x01 // 0001 in binary 
#define CONSTANT_2 0x02 // 0010 in binary 
#define CONSTANT_3 0x04 // 0100 in binary 

entonces puede hacer

int options = CONSTANT_1 | CONSTANT_3; // will have 0101 in binary. 

Como se puede ver, cada bit representa esa constante en particular. Para que pueda binario y en el código y la prueba de la presencia de cada una constante, como:

if (options & CONSTANT_3) 
{ 
    // CONSTANT_3 is set 
} 

recomiendo que lea acerca de las operaciones binarias (que funcionan como operadores lógicos, pero a nivel de bits), si asimila esto, te hará un mejor programador.

Saludos.

1

El número 1 se representa como 00000000000000000000000000000001 (1 < < n) significa cambiar las 1 en representación de 1 n lugares para la izquierda de modo (1 < < 3) sería 00000000000000000000000000001000 En un int que puede tener 32 opciones cada uno de los cuales se puede activar o desactivar. Opción número n es en si el bit enésimo es 1

2

Si nos fijamos en un número en binario, cada dígito está encendido (1) o apagado (0).

Puede usar operadores bit a bit para establecer o interrogar eficientemente los bits individuales para ver si están configurados o no.

Tome el valor de 8 bits 156. En binario esto es 10011100.

el conjunto bits corresponden a los bits 7, 4, 3, y 2 (valores 128, 16, 8, 4). Puede calcular estos valores con 1 << (position) con bastante facilidad. Entonces, 1 << 7 = 128.

0

1 << y es básicamente el mismo que 2 to the power of y

De manera más general, x << y es lo mismo que x multiplied by 2 to the power of y.

En x << y medios binarios que se mueven todos los bits de x a la izquierda de y lugares, añadiendo ceros en el lugar de los bits Movido:

00010 << 2 = 01000

Así:

1 << 1 = 2 
1 << 2 = 4 
1 << 3 = 8 
... 
0

<< es el operador de desplazamiento a la izquierda, desplaza los bits del primer operando dejados por el número de posiciones especificadas en el operando derecho (con ceros entrando en las posiciones desplazadas desde la derecha).

En su enumeración termina con valores que tienen un bit diferente establecido en 1, por lo que cuando construye algo como unitDate, luego puede averiguar qué banderas contiene utilizando el operador &, p. unitDate & NSMonthCalendarUnit == NSMonthCalendarUnit será cierto.