<< оператор в объекте c enum?

Я искал что-то и попал в это перечисление - это яблоко UITableViewCell.h.

Прошу прощения, если это тривиально, но мне интересно/интересно, в чем смысл этого.

Я знаю, что < от рубина, но я действительно не понимаю это перечисление?

enum {
    UITableViewCellStateDefaultMask                     = 0,
    UITableViewCellStateShowingEditControlMask          = 1 << 0,
    UITableViewCellStateShowingDeleteConfirmationMask   = 1 << 1
};

Спасибо

BTW Нашел это как отличный способ изучить кодирование, я пытаюсь один раз в день попасть в заголовочные файлы из списка на объекте.

Шани

Ответы

Ответ 1

Это флаги бит-поля. Они используются, потому что вы можете комбинировать их с помощью оператора bitwise-OR. Так, например, вы можете комбинировать их как

(UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask)

Они работают, если один бит установлен в целое число. В этом примере, в двоичном формате,

UITableViewCellStateShowingEditControlMask        = 0000 0001
UITableViewCellStateShowingDeleteConfirmationMask = 0000 0010

Когда они OR'ed вместе, они производят 0000 0011. Затем структура знает, что оба этих флага установлены.

Оператор << является сдвигом слева. Он сдвигает двоичное представление. Итак, 1 << 1 означает

0000 0001 shifted left by one bit = 0000 0010

1 << 2 будет равно 0000 0100.

Ответ 2

Фактически оператор BItwise shift

<<  Indicates the bits are to be shifted to the left.
>>  Indicates the bits are to be shifted to the right.

Таким образом, в вашем заявлении значение 1 < 0 обозначает 1 и 1 < 1 - 2

Ответ 3

Это общий трюк в C, чтобы использовать оператор поразрядного сдвига в значениях enum, чтобы вы могли комбинировать значения перечисления с поразрядным или оператором.

Этот фрагмент кода эквивалентен

enum {
    UITableViewCellStateDefaultMask                     = 0,
    UITableViewCellStateShowingEditControlMask          = 1, // 01 in binary
    UITableViewCellStateShowingDeleteConfirmationMask   = 2  // 10 in binary
};

Это позволяет побитовым or двум или более константам перечисления вместе

 (UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask) // == 3 (or 11 in binary)

чтобы дать новую константу, которая означает обе эти вещи одновременно. В этом случае ячейка отображает как элемент управления редактированием, так и элемент управления подтверждением удаления или что-то в этом роде.

Ответ 4

Это оператор битдвига. Это обычно используется для объектов, которые могут иметь множественное поведение (каждое перечисление является поведением).

Вот аналогичный пост, который может его лучше разъяснить.

Ответ 5

Эти типы операторов называются побитовым оператором, который работает с битовым значением числа. Эти операции очень быстрые по сравнению с другими арифметическими операциями.

Ответ 6

Эти операнды называются битдвигом. Оператор Bitshift может быть предпочтительным для  2 причины.    - Для быстрой работы    - Использовать несколько значений bool за один раз.

Например: 1 < 2 - сдвиг влево; это значит 1: 0001, 2: 0010

1 < 2 эта линия означает, что 2 следует оставить одним битом. В результате 0010 сместился на 0100

Также сдвинутое значение должно быть заказано как 1,2,4,8,16...

typedef NS_OPTIONS(int, EntityEngineer) {
EntityEngineeriOS = 1 << 0,
EntityCategoryAndroid = 1 << 1,
EntityCategoryDB = 1 << 2,
EntityCategoryTeamLead = 1 << 16,};

Теперь мы хотим проверить mutiple boolean в строке ниже,

char engineer = (EntityEngineeriOS | EntityCategoryAndroid);

char 0011 = (0001 | 0010);

if (engineer & EntityEngineeriOS) {
    NSLog(@"we are looking for a developer who can write objective c or java");
}

if (engineer & EntityCategoryDB) {
    NSLog(@"we are not looking for a DB manager");
}

Результат: мы ищем разработчика, который может писать объективные c или java