2015-03-08 3 views
0

J'ai du code dans un autre langage qui utilise une énumération et une liste de valeurs de l'énumération et utilise ensuite bit à bit pour obtenir un entier pour la liste de valeurs de l'enum.Méthode la plus efficace pour rechercher les résultats d'une opération bit à bit

HELLO = 1 
WORLD = 2 
AND = 4 
SO = 8 
ON = 16 

Donc, si j'avais BONJOUR et donc dans ma liste, je me faisais une valeur de retour

1 | 1000 = 1001 

1001bin to dec = 9 

Je suis en train de travailler à ce que la façon la plus efficace de prendre cet entier et de donner retourner une liste des énumérations qui ont été incluses.

+2

Est-ce une aide: http://stackoverflow.com/questions/93744/most-common-c-sharp-bitwise-operations-on-enums – Paddy

+0

S'il vous plaît noter, en C# votre exemple devrait lire '1 | 1000 == 1001' – DrKoch

+0

Merci @DrKoch - corrigé –

Répondre

2

En supposant que vous voulez travailler avec les énumérations directement, les types de base de tous les énumérations sont des nombres entiers. Avec cette connaissance, vous pouvez prendre la nature "illimitée" des entiers et apporter la bonté des énumérations.

enum Greetings { 
    HELLO = 1, 
    WORLD = 2, 
    AND = 4, 
    SO = 8, 
    ON = 16 
} 

Donc, si vous obtenez un entier retour de la callee (? Faire Interop), vous pouvez le faire:

Greetings greet = (Greetings)theIntegerResult; 

A partir de là, vous pouvez faire vos opérations au niveau du bit pour voir quels champs sont définis.

bool isHelloSet = (greet & Greetings.HELLO) == Greetings.HELLO; 
bool isWorldSet = (greet & Greetings.WORLD) == Greetings.WORLD; 
bool isAndSet = (greet & Greetings.AND) == Greetings.AND; 
bool isSoSet = (greet & Greetings.SO) == Greetings.SO; 
bool isOnSet = (greet & Greetings.ON) == Greetings.ON; 
1

En C#, utiliser Enum.HasFlag(v). Il reviendra si un enum a la valeur v définie.

Voir documentation on MSDN

+2

Ne pas utiliser 'Enum.HasFlag' si vous vous souciez des performances car il utilise la réflexion (par exemple [this] (http://stackoverflow.com/q/7368652/1364007) SO question). Utilisez plutôt un opérateur au niveau du bit. –