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?
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?
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
}
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.
< < 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.
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.
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) { ... }