Enumeration et comparaison AND sur les bits

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 11 juil. 2005 à 19:42
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 - 12 juil. 2005 à 10:00
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.

15 réponses

cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 juil. 2005 à 19:58
Salut,

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

?

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 29
11 juil. 2005 à 20:05
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 !!!
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 29
11 juil. 2005 à 20:14
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.
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 juil. 2005 à 20:19
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#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
11 juil. 2005 à 20:28
@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
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 juil. 2005 à 20:31
Exact...vraiment bien dépassé sur ce coup là

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
11 juil. 2005 à 20:45
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...
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
11 juil. 2005 à 20:50
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)

....
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
11 juil. 2005 à 21:04
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 !
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 juil. 2005 à 05:49
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
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 juil. 2005 à 06:19
Exemple 4

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


if ( ( V1 & V2 ) != 0 )
{
MessageBox.Show( "V2 est dans V1" );
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 juil. 2005 à 06:32
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.
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
12 juil. 2005 à 08:40
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 !
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 29
12 juil. 2005 à 09:14
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.
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
12 juil. 2005 à 10:00
Dommage pour "is" et "GetType()" !
Bon courage !
0
Rejoignez-nous