В этом конкретном фрагменте кода всегда будет выполняться второй оператор if
. Это потому, что operator.permissions & 2
всегда будет иметь значение 2
(так как переменная была установлена на 2
ранее).
&
немного бит AND
. 2
- это двоичный код 10
(в 32-битном формате это будет 0000 0000 0000 0000 0000 0000 0000 0010
). Когда вы делаете побитное AND
, значения конвертируются в двоичные (32-битный со старшим порядковым номером со знаком), и каждый бит одного операнда AND
изменяется вместе с другим. Когда вы AND
два равных значения, вы получите одно и то же значение в результате.
Несколько примеров (я использую 4-битные значения для удобства чтения):
1 & 1 = 0001 & 0001 = 0001 = 1
2 & 1 = 0010 & 0001 = 0000 = 0
3 & 1 = 0011 & 0001 = 0001 = 1
...
5 & 1 = 0101 & 0001 = 0001 = 1
и
1 & 2 = 0001 & 0010 = 0000 = 0
2 & 2 = 0010 & 0010 = 0010 = 2
3 & 2 = 0011 & 0010 = 0010 = 2
...
6 & 2 = 0110 & 0010 = 0010 = 2