enum понимание значений по умолчанию - PullRequest
1 голос
/ 08 февраля 2012

я использую target-c для разработки приложений ios

я обнаружил в документации, что перечисления имеют значения по умолчанию, например: "1 << 0" </p>

я не понимаю этогопример значения по умолчанию:

enum {
    UIDataDetectorTypePhoneNumber   = 1 << 0,
    UIDataDetectorTypeLink          = 1 << 1,
    UIDataDetectorTypeAddress       = 1 << 2,
    UIDataDetectorTypeCalendarEvent = 1 << 3,
    UIDataDetectorTypeNone          = 0,
    UIDataDetectorTypeAll           = NSUIntegerMax
};

Итак, каково значение по умолчанию для каждого элемента в этом перечислении?

спасибо

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Это перечисление с побитовыми значениями или битовыми флагами. Каждое значение является двоичным значением, в котором только один бит установлен в 1, а все остальные установлены в 0. Таким образом, вы можете сохранить в значении столько флагов, сколько битов имеет целое число.

Оператор сдвига влево «<<» - это смещение битов влево или на самую старшую сторону двоичного числа. Это то же самое, что вычисление операции "* 2" (умноженное на два). </p>

Например, в перечислении, которое вы отправили в своем вопросе, первое значение, UIDataDetectorTypePhoneNumber, равно 1. Второе, UIDataDetectorTypeLink, равно 2, а третье, UIDataDetectorTypeAddress, равно 4.

Вы комбинируете эти значения как флаги, чтобы установить несколько разных битов в одно и то же целое число:

NSInteger fooIntValue = UIDataDetectorTypePhoneNumber | UIDataDetectorTypeLink;

как '|' операция является побитовой, результатом будет двоичное значение ... 0011, то есть 3. И вы указываете, что ваша переменная fooIntValue имеет два флага, установленных в true для двух разных свойств.

2 голосов
/ 08 февраля 2012

Этот знак << предназначен для сдвига битов влево (умножения на 2). </p>

1 << 0 equals 1 (0b00000001)
1 << 1 equals 2 (0b00000010)
1 << 2 equals 4 (0b00000100)

Обычно, если вы не присваиваете какие-либо значения, компилятор определяет первое значение как 0, второе как 1 искоро.Вы можете всегда назначать значения самостоятельно, если хотите (назначение, на которое вы ссылаетесь, обычно используется для битовых масок, где каждый бит в байте или слове имеет свое собственное значение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...