Это способ создания констант, которые было бы легко смешивать. Например, у вас может быть API для заказа мороженого, и вы можете выбрать любой вкус ванили, шоколада и клубники. Вы можете использовать логические значения, но это немного тяжело:
- (void) iceCreamWithVanilla: (BOOL) v chocolate: (BOOL) ch strawerry: (BOOL) st;
Хорошая уловка для решения этой проблемы - использование чисел, где вы можете смешивать ароматы с помощью простого добавления. Допустим, 1 для ванили, 2 для шоколада и 4 для клубники:
- (void) iceCreamWithFlavours: (NSUInteger) flavours;
Теперь, если у номера установлен самый правый бит, в нем есть ванильный аромат, другой бит обозначает шоколад, а третий справа - клубника. Например, ванильный + шоколадный будет 1 + 2 = 3 десятичных (011
в двоичном формате).
Оператор битового смещения x << y
принимает левое число (x
) и сдвигает свои биты y
раз. Это хороший инструмент для создания числовых констант:
1 << 0 = 001 // vanilla
1 << 1 = 010 // chocolate
1 << 2 = 100 // strawberry
Вуаля! Теперь, когда вам нужен вид с гибким левым полем и гибким правым полем, вы можете смешивать флаги, используя побитовую или: FlexibleRightMargin | FlexibleLeftMargin
→ 1<<2 | 1<<0
→ 100 | 001
→ 101
. На принимающей стороне метод может маскировать интересующий бит, используя логические и:
// 101 & 100 = 100 or 4 decimal, which boolifies as YES
BOOL flexiRight = givenNumber & FlexibleRightMargin;
Надеюсь, это поможет.