<< оператор в объекте 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