Я редко встречаю код с битмасками, уж не знаю почему, но в основном люди предпочитают обходить их стороной. Разбираемся, ведь в них нет ничего сложного.

Битовые маски могут использоваться для манипулирования отдельными битами в числе. Это может быть полезно, например, чтобы проверить, является ли определенный бит установленным или снятым.

int value = 0b1011; // ставим дефолтное значение
// проверка, является ли второй бит установленным
if ((value & (1 << 1)) != 0) {
  // бит установлен
}

// установка третьего бита
value |= (1 << 2); // теперь value == 0b1111

// сброс третьего бита
value &= ~(1 << 2); // теперь value == 0b1011

Можно использовать биты в enum, записывать их можно по-разному:

enum MyEnum {
  None = 0,
  Value1 = 1 &lt;&lt; 0,
  Value2 = 1 &lt;&lt; 1,
  Value3 = 1 &lt;&lt; 2,
  Value4 = 1 &lt;&lt; 3,
  Value5 = 1 &lt;&lt; 4,
  Value1OrValue3 = Value1 | Value3,
}

enum MyEnum {
  None = 0,
  Value1 = 0x1,
  Value2 = 0x2,
  Value3 = 0x4,
  Value4 = 0x8,
  Value5 = 0x10,
  Value1OrValue3 = Value1 | Value3,
}

Записи эквиваленты друг другу, я встречал оба варианта.

Для вывода можно использовать аттрибут System.Flags, но он не является обязательным, хотя влияет на отображение в Unity Inspector и на вывод в лог.

Read More