<< оператор в целевом списке? - PullRequest
15 голосов
/ 28 декабря 2011

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

Извините, если это тривиально, но мне интересно / интересно, в чем смысл этого.

Я знаю << из ruby, но я не очень понимаю это перечисление? </p>

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

Спасибо

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

Шани

Ответы [ 6 ]

25 голосов
/ 28 декабря 2011

Это флаги битовых полей.Они используются, потому что вы можете объединить их, используя оператор побитового ИЛИ.Так, например, вы можете объединить их как

(UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask)

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

UITableViewCellStateShowingEditControlMask        = 0000 0001
UITableViewCellStateShowingDeleteConfirmationMask = 0000 0010

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

Оператор << - это сдвиг влево.Это сдвигает двоичное представление.Таким образом, 1 << 1 означает, что

0000 0001 shifted left by one bit = 0000 0010

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

4 голосов
/ 28 декабря 2011

На самом деле это оператор сдвига BItwise

<<  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 </p>

3 голосов
/ 28 декабря 2011

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

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

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

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

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

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

1 голос
/ 14 января 2012

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

1 голос
/ 28 декабря 2011

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

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

0 голосов
/ 14 февраля 2017

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

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

1 << 2, эта строка означает, что 2 должно быть оставлено на один бит.В результате значение 0010 смещено на 0100 </p>

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

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

Теперь мы хотим проверить множественное логическое значение вниже строки,

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

...