Пример:
Есть три стиля:
$Style1 = 1
$Style2 = 2
$Style3 = 4
Если их представить в бинарной системе счисления, получится
$Style1 = 001
$Style2 = 010
$Style3 = 100
Для каждого стиля используется свой бит, последний бит для первого стиля, предпоследний для второго итд.
Например мы используем 1 и 3 стили. 1+4=5. 5 в бинарной системе - 101.
10
1 последний бит - единица, значит используется первый стиль.
1
01 предпоследний бит - 0, значит второй стиль не используется.
101 первый бит - 1, значит используется третий стиль.
Проще говоря, стоит единица - есть стиль, стоит 0 - нет стиля.
Проблемы начнутся, если один и тот же стиль будет "прибавлен" несколько раз.
Например нам снова нужны 1 и 3 стили, но первый мы прибавим два раза.
1+1+4=6. 6 в бинарной системе - 110.
Вместо желаемого первого стиля получился второй, который был как раз не нужен.
Функция BitOR проверяет каждый бит нескольких чисел. Если хотя бы в одном из чисел этот бит равен 1 (похоже на оператор Or), то тот же по счёту бит в числе, которое вернёт функция, тоже будет 1, иначе 0.
Тот же пример с двумя одинаковыми стилями BitOR(1, 1, 4), в бинарной системе BitOR(001, 001, 100):
Проверяем первый бит:
Первое число - 0
Второе число - 0
Третье число - 1
Есть единица, значит в первом бите результата тоже будет единица.
Проверяем второй бит:
Первое число - 0
Второе число - 0
Третье число - 0
Нет единицы, значит во втором бите результата будет ноль.
Проверяем третий бит:
Первое число - 1
Второе число - 1
Третье число - 0
Есть единица, значит в третьем бите результата тоже будет единица.
Итого: 101, в десятичной системе это 5, несмотря на то, что первый стиль был использован два раза.