2010-01-24 19 views
18

me encontré con este pedazo de código:¿Qué hace (1U << X)?

enum 
{ 
    IsDynamic = (1U << 0), // ... 
    IsSharable = (1U << 1), // ... 
    IsStrong = (1U << 2) // ... 
}; 

¿Qué significa el (1U << X) hacer?

Respuesta

31

establece máscaras de bits:

1U << 0 = 1 
1U << 1 = 2 
1U << 2 = 4 
etc... 

Lo que sucede es 1U (valor sin signo 1) se desplaza a la izquierda por x bits.

El código que envió es equivalente a:

enum 
{ 
     IsDynamic = 1U, // binary: 00000000000000000000000000000001 
     IsSharable = 2U, // binary: 00000000000000000000000000000010 
     IsStrong = 4U // binary: 00000000000000000000000000000100 
} 
2

desplazamiento de bits. En lugar de decir a = 1, b = 2, c = 4, cambian los bits. La idea es agrupar muchas banderas en un entero (o largo).

Este es un enfoque muy limpio.

2

< < es el operador de desplazamiento de bits. Tomará los bits en el lado izquierdo y los desplazará en una cantidad especificada por el lado derecho. Por ejemplo:

1 << 1 -> 0b0001 << 1  => 0b0010 
1 << 2 -> 0b0001 << 2  => 0b0100 

etc.

0

1U es un valor sin signo con el único bit 0 set, y todos los otros bits despejado. El operador << significa "desplazar hacia la izquierda". 1U << 0 significa crear un valor con el conjunto de bit 0; 1U << 1 significa crear un valor con el bit 1 establecido; etc.

0

Este recorte

enum 
{ 
     IsDynamic = (1U << 0), // ... 
     IsSharable = (1U << 1), // ... 
     IsStrong = (1U << 2) // ... 
} 

declara una enumeración con valores que sean potencias de 2. Para poder ser utilizados presumiblemente como máscaras en un valor que contiene varias banderas.

Así, por ejemplo, un valor que representa algo que IsDynamic y IsSharable es

unsigned value = IsDynamic | IsSharable; // could use + as well 

Y para poner a prueba si el valor IsStrong

if (value & IsStrong) { ... } 
Cuestiones relacionadas