Enumeration et comparaison AND sur les bits

Signaler
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
-
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
-
Bonjour à tous ... voila ce qui m'amène ...
J'ai créer une énumération du type ...

public Enum MonEnum
{
valeur1 = 1,
valeur2 = 2,
valeur3 = 4,
valeur4 = 8,
valeur5 = Valeur1 + Valeur2,
...
}

Derrière cela, je veux comparer bit à bit deux variables V1 et V2 -de type MonEnum-, pour savoir si V1 correspond à la valeur ciblé par V2
Si V2 vaut valeur1, valeur2, valeur3 ou valeur4, je peux faire un test dégalité (==) mais si V2 vaut Valeur5, V1 devrait pouvoir valoir Valeur1, Valeur2 ou Valeur5 (pas sur que je soit clair la !!)
Alors j'ai voulu faire un truc du genre
if (V1 & V2)
{
return "OK"
}
else
return "KO"
mais le compilateur me dit qu'il ne peut pas convertir implicitement MonEnum en bool !!!
Comment que je peux faire ????

Christophe R.
A voir également:

15 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Ce ne serais pas plutôt :
if ( (V1 & V2)==V1)
{
return "OK";
}
else
return "KO";

?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
Je suis arrivé à ...
if ((V1 & V2) != 0) ....
et la ca compile bien mais en debuguant, si je met (V1 & V2) en tant qu'espion, il me m'affiche "impossible d'évaluer l''expresison" et le test est toujours vrai !!!
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
Merci "coq" mais je galère toujours ....

Je suis en train de m'embrouiller grave la !!!
Je vosu redonne toutes les billes depuis le début :
Cette enum me sert à qualité le "type" d'un objet. En gros, cela peut être :
-Un caractère,
-un entier,
-un reel,
-un nombre (ce qui regroupe les entiers et les reels)

Par la suite, j'ai une fonction qui recoit un objet (avec son type défini) et un type requis pour que la fonction se déroule bien.
Je dois donc comparé le type de l'objet reçu avec le type attendu.
Comme il pourrai arrivé que l'on attende un nombre (plutot qu'un entier ou un reel), je voulais me simplifer la vie en evitant de coder tout un tas de tests (par des if ou un switch) en me disant qu'une comparaison au niveau des bits le ferait en un seul test, mais je m'enfonnnnnnncccccccceeeeeeeeeeee !!
si une âme charitable peut me venir en aide ...

Christophe R.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Désolé, la logique binaire me depasse un peu là.
Sinon sauf erreur le seul moyen que ton test "if ((V1 & V2) != 0)" soit faux serait que V1 et/ou V2 valle 0 non ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
@coq :

non... par exemple si V1 0x01 1 et V2 = 0x10 = 2 alors on obtient V1 & V2 = 0x00 = 0



@ crenaud76 :

if ((V1 & V2) ! = 0) devrait fonctionner a priori...

Je vais essayer
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Exact...vraiment bien dépassé sur ce coup là

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
En tout cas :

public enum MonEnum : uint

{

valeur1 = 1,

valeur2 = 2,

valeur3 = 4,

valeur4 = 8,

valeur5 = 9

}



static void Main(string[] args)

{

MonEnum toto = MonEnum.valeur5;



if ((toto & MonEnum.valeur1) !=0 )

System.Console.WriteLine("valeur1");

if ((toto & MonEnum.valeur2) != 0)

System.Console.WriteLine("valeur2");

if ((toto & MonEnum.valeur3) !=0 )

System.Console.WriteLine("valeur3");

if ((toto & MonEnum.valeur4) !=0 )

System.Console.WriteLine("valeur4");



System.Console.WriteLine("-- FIN --");

Console.ReadLine();

}



M'affiche bien les "valeur1" et "valeur4" attendus..

Et quand je mets "toto & MonEnum.valeur1", "toto & MonEnum.valeur2", "toto & MonEnum.valeur3" et "toto & MonEnum.valeur4" en espion, les résultats qu'il m'affiche sont bons (à savoir "MonEnum.valeur1", "0", "0", "MonEnum.valeur4")



Bref.. A priori ça doit passer...
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
A part ça..

Vu que ton but est de trouver le type de ton objet,

utiliser l'opérateur "is" ne fonctionne pas dans ton cas ??

Par exemple :



if (toto is int)

....
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
Autre suggestion..

Si tu veux tester qu'un objet V1 soit de même type qu'un objet V2 :

"if (V1.GetType().Equals(V2.GetType()))"



Par contre dans cette méthode même si V1 appartient à un type dérivant
de V2, le test sera faux... Il ne sera vrai que si V1 et V2 sont
exactement de même types...



Alors que dans la méthode précédente (en utilisant "is"), si V1 appartient à un type dérivant par exemple du type int, le test "V1 is int" sera vrai....



Bref, que tu utilises "is" ou "GetType", vérifie bien que l'utilisation que tu en fais corresponde à ce que tu as besoin !
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, l'expression "if ( ( V1 & V2 ) != 0 )" n'a aucun sens, elle donne toujours 0. Je ne vois pas à quel test elle pourrait bien servir.

Si on part de cette énumération:


[ Flags ]
public enum E
{
V1 = 1, // ...00000001
V2 = 2, // ...00000010
V3 = 4, // ...00000100
V4 = 8, // ...00001000
V5 = V1 | V2, // Opérateur OU binaire.
}


OU donne toujours 1 sauf ( 0 OU 0 )


ex: V1 OU V2


V1 ...00000001
V2 ...00000010
OU -----------
...00000011


ET donne toujours 0 sauf ( 1 ET 1 )


ex: V1 ET V2


V1 ...00000001
V2 ...00000010
ET -----------
...00000000


Exemple 1


MessageBox.Show( ( ( int )( E.V1 & E.V2 ) ).ToString( ) ); // Affiche 0.
MessageBox.Show( ( ( int )( E.V1 | E.V2 ) ).ToString( ) ); // Affiche 3.


Exemple 2


if ( ( E.V1 & E.V2 ) != 0 )
{
// Erreur, Impossible de compiler !
// CS0162: Unreachable code detected.
// Apparament le compilateur C# est plus malin que ceui de VB : )
MessageBox.Show( "V2 est dans V1" ); // Bha non y'a aucune chance : )
}


Exemple 3


E myEnum = E.V1;


if ( ( myEnum & E.V1 ) == E.V1 )
{
MessageBox.Show( "V1 est dans myEnum" ); // OK
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Exemple 4

E V1 = E.V1;
E V2 = E.V1;


if ( ( V1 & V2 ) != 0 )
{
MessageBox.Show( "V2 est dans V1" );
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Vi vi j'ai rajouté l'exemple 4 quand j'ai vu que je parlais pas tout a fait de la même chose que vous.
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
Dans le cas où V1 et V2 sont définis dans l'énumération,

effectivement écrire "if ((V1 & V2) != 0)" n'apporte pas grand chose..

Ton exemple 2 revient donc à faire un test "if ((1 & 2) != 0)".... ... que le compilateur signale (c'est sympa de sa part !)



Ton exemple 4 est effectivement plus proche de ce dont on parlait au dessus !
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
Merci pour toutes vos propositions de code ... je m'en vais les tester cet après-midi et vous tiendrais au courant ...

Troborg < Je ne peux pa utiliser l'opérateur Is ou la méthode GetType() car mes objets ne sont pas des objets intrinsèques de .NET ! Ce sont des objets relativement complexes et je n'ai pas d'autres choix que de passer par une propriétés que j'ai nommée "Type". En fait, je crois qu'il me faudrait non pas daire une classe objet, mais plusieurs classes objets héritant d'une autre classe d'objet plus générale. Mais j'en suis à mes balbutiement en C# et ne me suis pas encore pencher sur le PB. Mais en écrivant ces ligne et en y reflechissant, je me dit que ce sera peut-être la meilleure option pour mon cas. Va falloir que je creuse cela plus tard ...

Christophe R.
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
5
Dommage pour "is" et "GetType()" !
Bon courage !