Ответ 1
<<
- оператор битовой смены. Таким образом, 1 << 2
говорит, что он переводит бит на два пробела.
Пример:
В двоичном выражении число 1
равно:
0001
1 << 2
означает смещение всех битов в левое 2 пробела, что приводит к этому значению:
0100
или 4
.
Таким образом, значения каждого ENUM в вашем примере равны: 1, 2, 4, 8, 16 и т.д. Они могли бы точно установить каждое перечисление на эти значения. Но поскольку они используют это перечисление для нескольких значений, двоичные значения делают его более понятным:
0001
0010
0100
1000
чтобы они писали, используя сдвиги бит.
так что если я OR (|
) два из этих значений вместе, например FlexibleLeftMargin
(0001
) и FlexibleWidth (0010
), я получаю следующее значение:
0011
Поэтому они используют каждый бит в качестве флага, поэтому они знают, что у вас установлено несколько значений.
Теперь вы можете использовать оператор AND &
, чтобы выяснить, установлено ли определенное значение.
0010 & 0011 = 0010
Итак, вы можете сделать это, чтобы проверить, есть ли у вас один из перечислений:
myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin);
if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) {
// myenum has UIViewAutoresizingFlexibleLeftMargin set!
}
Надеюсь, это имеет смысл. Для более подробного объяснения поразрядных операций читайте это: Wikipedia ~ Bit Operators или найдите вокруг " бит-операторы"