Подтвердить что ты не робот

Что делает (1U << X)?

Я нашел этот фрагмент кода:

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

Что делает (1U << X)?

4b9b3361

Ответ 1

Он устанавливает битмаски:

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
}

Ответ 2

Бит сдвига. Вместо того, чтобы говорить, что a = 1, b = 2, c = 4, они сдвигают биты. Идея состоит в том, чтобы упаковать множество флагов в одно целое (или длинное).

Это действительно очень чистый подход.

Ответ 3

< < является оператором битдвига. Он будет принимать бит в левой части и сдвигать их на количество, указанное правой стороной. Например:

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

и др.

Ответ 4

1U - это значение без знака с установленным единственным битом 0, а все остальные бит очищены. Оператор << означает "сдвиг влево". 1U << 0 означает создание значения с установленным битом 0; 1U << 1 означает создание значения с набором бит 1; и др.

Ответ 5

Этот фрагмент

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