Я редко встречаю код с битмасками, уж не знаю почему, но в основном люди предпочитают обходить их стороной. Разбираемся, ведь в них нет ничего сложного.
Битовые маски могут использоваться для манипулирования отдельными битами в числе. Это может быть полезно, например, чтобы проверить, является ли определенный бит установленным или снятым.
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 << 0, Value2 = 1 << 1, Value3 = 1 << 2, Value4 = 1 << 3, Value5 = 1 << 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 и на вывод в лог.