Я нашел этот фрагмент кода:
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
};
Что делает (1U << X)
?
Я нашел этот фрагмент кода:
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
};
Что делает (1U << X)
?
Он устанавливает битмаски:
1U << 0 = 1
1U << 1 = 2
1U << 2 = 4
etc...
Что происходит, 1U (без знака 1) сдвигается влево на x бит.
Код, который вы опубликовали, эквивалентен:
enum
{
IsDynamic = 1U, // binary: 00000000000000000000000000000001
IsSharable = 2U, // binary: 00000000000000000000000000000010
IsStrong = 4U // binary: 00000000000000000000000000000100
}
Бит сдвига. Вместо того, чтобы говорить, что a = 1, b = 2, c = 4, они сдвигают биты. Идея состоит в том, чтобы упаковать множество флагов в одно целое (или длинное).
Это действительно очень чистый подход.
< < является оператором битдвига. Он будет принимать бит в левой части и сдвигать их на количество, указанное правой стороной. Например:
1 << 1 -> 0b0001 << 1 => 0b0010
1 << 2 -> 0b0001 << 2 => 0b0100
и др.
1U
- это значение без знака с установленным единственным битом 0, а все остальные бит очищены. Оператор <<
означает "сдвиг влево". 1U << 0
означает создание значения с установленным битом 0; 1U << 1
означает создание значения с набором бит 1; и др.
Этот фрагмент
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
}
объявляет перечисление со значениями, которые имеют степень 2. Для использования предположительно как маски для значения, содержащего несколько флагов.
Итак, например, значение, представляющее что-то, что IsDynamic и IsSharable
unsigned value = IsDynamic | IsSharable; // could use + as well
И проверить, если значение IsStrong
if (value & IsStrong) { ... }