2016-12-18 3 views
4

Обычно, когда я создаю перечисление каждый из них получают увеличивается на единицу, смКак мне перечислить перечисление?

enum 
{ 
    A = 0, 
    B, 
    C, 
    D 
}; 

, но после того, как я посмотрел на некоторые исходные коды, я вижу, что люди делают вещи как этот

enum 
{ 
    A = 0, 
    B = 1 << 0, 
    C = 1 << 1, 
    D = 1 << 2 
}; 

Я понимаю, что это значит, но что именно это дает мне? Есть ли преимущества? Я вижу только, что это, по моему мнению, выглядит необычным.

+2

Скорее всего, элементы этого перечисления используются как некоторый флаг, который смешивается побитовыми операциями. –

+1

Обратите внимание, что если 'A' также является флагом, вы не должны присваивать ему значение' 0', чтобы впоследствии вы могли проверить его представляющий бит ('0', конечно, не бит). –

ответ

7

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

struct foo { 
    std::uint32_t bitmask; // up to 32 different flags. 
}; 

foo obj; 
obj.bitmask = (B | D); // Sets the bits 0 and 2 
+0

Это объяснило мне это, спасибо. – anon

5

Это создает тип битовой маски с уникальными установленными битами, так что выражение B | C гарантированно не быть таким же, как D.

Если вы просто хотите уникальные значения перечисления, которые не объединены, первая версия полностью в порядке. И вы действительно не должны использовать = 0 для первого значения. В любом случае это будет по умолчанию.