Битовое "ИЛИ" констант

При чтении некоторой документации здесь, я столкнулся с этим:

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) операторы / работа переменных? Я сожалею, если это тривиально, но кто-то мог бы просветить меня или объяснением или возможно регистрацией ссылки на хорошее объяснение?

9
задан Chris says Reinstate Monica 4 November 2011 в 18:02
поделиться

5 ответов

В основном константы представлены одним битом, поэтому, если у вас есть 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
}

Я рекомендую вам прочитать о двоичных операциях (они работают как ЛОГИЧЕСКИЕ операторы, но на уровне битов), если вы попробуете этот материал, это сделает вас немного лучше программиста.

Ура.

10
ответ дан 4 December 2019 в 15:12
поделиться

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
...
0
ответ дан 4 December 2019 в 15:12
поделиться

<< - это оператор сдвига влево, он сдвигает биты первого операнда влево на количество позиций, указанное в правом операнде (при этом нули приходят на сдвинутые позиции справа).

В вашем перечислении вы получаете значения, у которых каждый бит установлен в 1, поэтому, когда вы создаете что-то вроде unitDate, вы можете позже узнать, какие флаги оно содержит, используя оператор &, например, unitDate & NSMonthCalendarUnit == NSMonthCalendarUnit будет истинным.

0
ответ дан 4 December 2019 в 15:12
поделиться

Если вы посмотрите на число в двоичном формате, каждая цифра либо включена ( 1 ), либо выключена ( 0 ).

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

Возьмите 8-битное значение 156. В двоичном формате это 10011100 .

Установленные биты соответствуют битам 7 , 4 , 3 и 2 (значения 128 , 16 , 8 , 4 ). Вы можете довольно легко вычислить эти значения с помощью 1 << (позиция) . Итак, 1 << 7 = 128 .

2
ответ дан 4 December 2019 в 15:12
поделиться

Число 1 представлено как 00000000000000000000000000000001. (1 << n) означает сдвиг представления 1 в 1 на n позиций влево Итак (1 << 3) будет 00000000000000000000000000001000 В одном int у вас может быть 32 параметра, каждый из которых может быть включен или выключен. Параметр номер n включен, если n-й бит равен 1

1
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: