9
votes

Testez une valeur [Flags] Enum pour une seule valeur

Si j'ai un Enum code> qui est marqué avec [indicateurs] code>, existe-t-il un moyen de tester une valeur de ce type pour voir si elle ne contient que valeur unique? Je peux obtenir le résultat que je veux utiliser un bit-comptage, mais je préférerais utiliser des fonctions intégrées si possible.

Lorsque vous bougeez dans le Enum code> valeurs de manière dynamique, Enum.getvalues ​​( ) code> retourne aussi les drapeaux combinés. Appelant cette fonction sur le Enum code> dans l'exemple suivant renvoie 4 valeurs. Cependant, je ne veux pas que la valeur combinaisons em> incluse dans l'algorithme interne. Test individuel Enum code> pour l'égalité est sorti, car le Enum code> pourrait potentiellement contenir de nombreuses valeurs, et nécessite également une maintenance supplémentaire lorsque les valeurs du Enum code > Changement. P>

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}


0 commentaires

3 Réponses :


20
votes

Vous pouvez le jeter à int et utiliser les techniques de BIG TwidDling Hacks Pour vérifier s'il s'agit d'une puissance de deux. XXX


1 commentaires

+1. Bien que définitivement la technique la plus transparente, c'est sans aucun doute le plus simple.



0
votes

Vous pouvez utiliser une combinaison de ISdefinefinine et de vérifier les pouvoirs de 2.


1 commentaires

Dans l'exemple que j'ai écrit, est défini évaluerait toujours à vrai .



-1
votes

Vous pourriez que vous pourriez vous enumber.getvalues ​​et ne comptez que les articles qui sont une puissance de 2 (uniformément divisible par 2 sans reste).


0 commentaires