Что означает это перечисление? - PullRequest
2 голосов
/ 27 августа 2011

Я видел эту строку кода сегодня и понятия не имел, что она делает.

typedef enum {
  SomeOptionKeys = 1 << 0 // ?
} SomeOption;

Некоторое использование или пример будут полезны.Спасибо!

Ответы [ 4 ]

9 голосов
/ 27 августа 2011

Похоже, он определяет перечислимый тип, который должен содержать набор флагов.Можно ожидать, что они будут определены больше, например:

typedef enum {
  FirstOption = 1 << 0,
  SecondOption = 1 << 1,
  ThirdOption = 1 << 2
} SomeOption;

Поскольку они определены как степени двойки, каждое значение соответствует одному биту в целочисленной переменной.Таким образом, вы можете использовать побитовые операторы, чтобы объединить их и проверить, установлены ли они.Это обычный шаблон в коде C.

Вы можете написать код, который объединяет их:

SomeOption myOptions = FirstOption | ThirdOption;

И вы можете проверить, какие параметры установлены следующим образом:

if (myOptions & ThirdOption)
{
  ...
}
4 голосов
/ 27 августа 2011

Значение SomeOptionKeys равно единице, это полезное представление при работе с флагами:

typedef enum {
  flag1 = 1 << 0, // binary 00000000000000000000000000000001
  flag2 = 1 << 1, // binary 00000000000000000000000000000010
  flag3 = 1 << 2, // binary 00000000000000000000000000000100
  flag4 = 1 << 3, // binary 00000000000000000000000000001000
  flag5 = 1 << 4, // binary 00000000000000000000000000010000
  // ...
} SomeOption;

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

Редактировать:

Хотя, я должен сказать, что я мог что-то упустить, но мне кажется излишним использовать для этого перечисления.Поскольку вы теряете любое преимущество перечислений в этой конфигурации, вы также можете использовать #define:

#define flag1 (1<<0)
#define flag2 (1<<1)
#define flag3 (1<<2)
#define flag4 (1<<3)
#define flag5 (1<<4)
2 голосов
/ 27 августа 2011

Он просто устанавливает перечисление на значение 1. Возможно, оно предназначено для указания того, что значения должны быть степенями 2. Следующее может быть присвоено 1 << 1 и т. Д.

1 голос
/ 27 августа 2011

<< - оператор левого смещения. В общем, это используется, когда вы хотите, чтобы ваши перечисления маскировали один бит. В этом случае сдвиг фактически ничего не делает, так как он равен 0, но вы можете увидеть его всплывающим в более сложных случаях. </p>

Пример может выглядеть так:

typedef enum {
   OptionKeyA = 1<<0,
   OptionKeyB = 1<<1,
   OptionKeyC = 1<<2,
} OptionKeys;

Тогда, если у вас есть какая-то функция, которая использует клавишу опции, вы можете использовать enum в качестве битовой маски, чтобы проверить, установлена ​​ли опция.

int ASet( OptionKeys x){
   return (x & OptionKeyA);
}

Или, если у вас есть битовая карта флага и вы хотите установить одну опцию:

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