Кстати, да. Но я, к сожалению, пока не въехал, как правильно работать с битовыми операциями из скриптов, как изменить значение определённого бита в переменной, и как прочитать его. Буду благодарен за разъяснения. Но это потом.
Достаточно знать таблицы истинности для И, ИЛИ, НЕ.
INT состоит из 32-ух бит и в двоичном виде выглядит так
00000000000000000000000000000000 bin min
11111111111111111111111111111111 bin max
в шестнадцатиричном так
00000000 hex min
FFFFFFFF hex max
Для нас знак не имеет значения.
Нумеруются биты справа налево с 0 до 31. Их можно использовать по отдельности и группами. К примеру будем использовать бит 15 (по счету он 16-ый). Договоримся, если бит установлен, значит произошло какое-то действие, например, ГГ убил хотя бы одного горожанина.
var int state; //флаги состояния ГГ, где бит 15 отвечает за убийство горожанина
Запишем маску для флага
0000000000000000
1000000000000000 bin
00008000 hex
32768 dec
Записывать флаги в виде целых чисел не удобно. Есть такая операция побитовый сдвиг влево и вправо. Например,
1<<15 сдвинет бит 0 установленный в 1 влево на 15 разрядов, так как нам нужно. То есть число
0000000000000000000000000000000
1 bin
после это операции сдвига станет
0000000000000000
1000000000000000 bin
таким образом нам удобно записывать бит так
const int killerFlag = 1<<15;
Помнишь GS к такому виду приводит некоторые инты флаговые.
Инициализация в начале ГГ не убийца
state = state & ~killerFlag; //бит 15 сбрасываем в 0, остальные биты не затрагиваем
ГГ убил горожанина
state = state | killerFlag; //бит 15 устанавливаем в 1, остальные биты не затрагиваем
Проверяем, убил ли ГГ горожанина
if(state && killerFlag)
{
//да, убил таки
}
else
{
//не убивал
};
По другому
if(!(state && killerFlag))
{
//не убивал
}
else
{
//убил
};
Немножко двоичной арифметики, и все готово.
Не путай главное логические операции сравнения
! || &&
и логические операции над битами
~ | &
С новым годом!