При чтении некоторой документации здесь, я столкнулся с этим:
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
Я понятия не имею, как это работает. Я читал на побитовых операторах в C, но я не понимаю, как можно соответствовать три (или больше!) константы в одной международной и более поздней способности так или иначе извлечь их назад из интервала? Роя далее вниз документацию, я также нашел это, которое, вероятно, связано:
typedef enum {
kCFCalendarUnitEra = (1 << 1),
kCFCalendarUnitYear = (1 << 2),
kCFCalendarUnitMonth = (1 << 3),
kCFCalendarUnitDay = (1 << 4),
kCFCalendarUnitHour = (1 << 5),
kCFCalendarUnitMinute = (1 << 6),
kCFCalendarUnitSecond = (1 << 7),
kCFCalendarUnitWeek = (1 << 8),
kCFCalendarUnitWeekday = (1 << 9),
kCFCalendarUnitWeekdayOrdinal = (1 << 10),
} CFCalendarUnit;
Как делают (1 << 3)
операторы / работа переменных? Я сожалею, если это тривиально, но кто-то мог бы просветить меня или объяснением или возможно регистрацией ссылки на хорошее объяснение?
В основном константы представлены одним битом, поэтому, если у вас есть 32-битное целое число, вы можете в него поместились 32 константы. Ваши константы должны быть степенями двойки, поэтому для их представления требуется только один "установленный" бит.
Например:
#define CONSTANT_1 0x01 // 0001 in binary
#define CONSTANT_2 0x02 // 0010 in binary
#define CONSTANT_3 0x04 // 0100 in binary
, тогда вы можете сделать
int options = CONSTANT_1 | CONSTANT_3; // will have 0101 in binary.
Как видите, каждый бит представляет эту конкретную константу. Таким образом, вы можете использовать двоичное И в своем коде и проверить наличие каждой константы, например:
if (options & CONSTANT_3)
{
// CONSTANT_3 is set
}
Я рекомендую вам прочитать о двоичных операциях (они работают как ЛОГИЧЕСКИЕ операторы, но на уровне битов), если вы попробуете этот материал, это сделает вас немного лучше программиста.
Ура.
1 << y
по сути то же самое, что 2 в степени y
В общем, x << y
то же самое, что x умноженное на 2 в степени y
.
В двоичном формате x << y
означает перемещение всех битов x
влево на y
разрядов, добавление нулей вместо перемещенных битов. :
00010 << 2 = 01000
Итак:
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
...
<<
- это оператор сдвига влево, он сдвигает биты первого операнда влево на количество позиций, указанное в правом операнде (при этом нули приходят на сдвинутые позиции справа).
В вашем перечислении вы получаете значения, у которых каждый бит установлен в 1, поэтому, когда вы создаете что-то вроде unitDate
, вы можете позже узнать, какие флаги оно содержит, используя оператор &
, например, unitDate & NSMonthCalendarUnit == NSMonthCalendarUnit
будет истинным.
Если вы посмотрите на число в двоичном формате, каждая цифра либо включена ( 1
), либо выключена ( 0
).
Вы можете использовать побитовые операторы для эффективной установки или опроса отдельных битов, чтобы узнать, установлены они или нет.
Возьмите 8-битное значение 156. В двоичном формате это 10011100
.
Установленные биты соответствуют битам 7
, 4
, 3
и 2
(значения 128
, 16
, 8
, 4
). Вы можете довольно легко вычислить эти значения с помощью 1 << (позиция)
. Итак, 1 << 7
= 128
.
Число 1 представлено как 00000000000000000000000000000001. (1 << n) означает сдвиг представления 1 в 1 на n позиций влево Итак (1 << 3) будет 00000000000000000000000000001000 В одном int у вас может быть 32 параметра, каждый из которых может быть включен или выключен. Параметр номер n включен, если n-й бит равен 1