2011-08-26 7 views
2

J'ai vu cette ligne de code aujourd'hui et je n'avais aucune idée de ce qu'elle faisait.Que signifie cette énumération?

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

Une utilisation ou un exemple serait utile. Merci!

+0

'1 << 0 == 1', je ne vois pas le point. Est-ce le 'enum' complet? Ces constructions sont souvent utilisées avec '|'. –

+0

@WTP c'est probablement une partie de ça. Il est commun de voir plusieurs valeurs dans l'énumération comme 'fst = 1 << 0, sec = 1 << 1, thr = 1 << 2' juste pour être complet (dans les colonnes, bien sûr, pas dans celui-ci- ligne). – sidyll

Répondre

9

On dirait qu'il définit un type énuméré qui est censé contenir un ensemble de drapeaux. Vous vous attendez à voir plus d'entre eux définis, comme ceci:

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

Puisqu'ils sont définis comme des puissances de deux, chaque valeur correspond à un seul bit dans une variable entière. Ainsi, vous pouvez utiliser les opérateurs au niveau du bit pour les combiner et tester s'ils sont définis. C'est un modèle courant dans le code C.

Vous pouvez écrire un code comme celui qui les combine:

SomeOption myOptions = FirstOption | ThirdOption; 

Et vous pouvez vérifier quelles options sont définies comme suit:

if (myOptions & ThirdOption) 
{ 
    ... 
} 
+0

+1 car c'est à mon avis la réponse la plus complète ici et j'ai aussi appris quelque chose. –

+0

Merci pour cette réponse complète! – saurb

+0

Content de pouvoir aider. –

2

Il définit simplement enum à la valeur 1. Il est probablement destiné à indiquer que les valeurs doivent être des puissances de 2. Le prochain serait peut-être affecté 1 << 1, etc.

4

La valeur de SomeOptionKeys est un, c'est une représentation utile lorsque vous travaillez avec des drapeaux:

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; 

façon Whit chaque drapeau n'a qu'un seul bit, et ils pourraient être représentés dans une image bitmap.

Edit:

Bien que, je dois dire que je pourrais manquer quelque chose, mais il me semble redundent à utiliser énumérations pour cela. Puisque vous perdez un avantage de énumérations dans cette configuration, vous pouvez aussi bien utiliser #define:

#define flag1 (1<<0) 
#define flag2 (1<<1) 
#define flag3 (1<<2) 
#define flag4 (1<<3) 
#define flag5 (1<<4) 
1

< < est l'opérateur de décalage vers la gauche. En général, ceci est utilisé lorsque vous voulez que vos énumérations masquent un seul bit. Dans ce cas, le décalage ne fait rien puisque c'est 0, mais vous pourriez le voir apparaître dans des cas plus complexes.

Un exemple pourrait ressembler à:

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

Alors si vous aviez une fonction qui a pris une touche d'option, vous pouvez utiliser le ENUM comme bitmask pour vérifier si une option est activée.

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

Ou si vous aviez un bitmap de drapeau et je voulais mettre une option:

myflags | OptionKeyB