IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

OR ou XOR entre 2 int.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut OR ou XOR entre 2 int.
    Bonjour,

    Je cherche à faire l'opération suivante en c# :

    (x OR (2^n)) = x par exemple (66 OR (2^6))=66.

    Mais le OR (||) en c# ne fonctionne qu'entre 2 valeurs boolean.

    Comment puis-je réaliser ce type d'opération (qui fonctionne très bien en VB).

    Merci pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Citation Envoyé par pilote35 Voir le message
    (x OR (2^n)) = x par exemple (66 OR (2^6))=66.
    c est un test pour savoir si 66 == 66 ou 2^6 == 66 ?
    ou si (66 ou logique (2^6) == 66 ?

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Essaye avec l'opérateur "|" qui est à la fois un opérateur booléen et un opérateur bitwise.
    L'opérateur "||" est le "OU" booléen optimisé qui autorise à ne pas évaluer la totalité d'un prédicat.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Essaye avec l'opérateur "|" qui est à la fois un opérateur booléen et un opérateur bitwise.
    L'opérateur "||" est le "OU" booléen optimisé qui autorise à ne pas évaluer la totalité d'un prédicat.
    J'ai essayé l'opérateur | mais il réalise une simple addition sur 2 entiers et non un OU logique bit à bit.

  5. #5
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        2 : 0010
     OU 4 : 0100
     =  6 : 0110
    Et oui, un OU bit à bit ca donne le même résultat qu'une addition dans certains cas.
    Mais pas dans d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        3 : 0011
     OU 2 : 0010
     =  3 : 0011
    Le | est un OU binaire (bitwise, bit à bit), alors que le || est un OU logique (retourne VRAI si la partie gauche est VRAI ou que la partie droite est VRAI, ces deux parties peuvent être des expressions, un nombre est considéré vrai s'il est différent de 0).

    Edit : Ah oui, autre chose :
    66 | (2^6) == 66; // Vrai tant que 2^6 inférieur ou égale à 66
    66 == 66 || 2^6 == 66; // Toujours vrai puisque 66 = 66.

    Les masques binaires seront plutot à utiliser comme ca :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public class MaForm : Form
    {
    int _checked = 0;
     
    const int CASE_1 = 1;
    const int CASE_2 = 2;
    const int CASE_3 = 4;
    const int CASE_4 = 8;
    ....
     
    public int Check
    {
    get { return _checked;}
    set { _checked = value; DoCheck();}
    }
     
    private void DoCheck()
    {
    MaCheckBox1.Checked = (_checked & CASE_1) != 0;
    MaCheckBox2.Checked = (_checked & CASE_2) != 0;
    MaCheckBox3.Checked = (_checked & CASE_3) != 0;
    MaCheckBox4.Checked = (_checked & CASE_4) != 0;
    }
     
    private void MaCheckBox1_CheckedChanged(object sender, EventArgs e)
    {
    if(MaCheckBox1.Checked)
    _checked |= CASE_1;
    else
    _checked &= !CASE_1;
    }
     
    private void MaCheckBox2_CheckedChanged(object sender, EventArgs e)
    {
    if(MaCheckBox2.Checked)
    _checked |= CASE_2;
    else
    _checked &= !CASE_2;
    }
     
    private void MaCheckBox3_CheckedChanged(object sender, EventArgs e)
    {
    if(MaCheckBox3.Checked)
    _checked |= CASE_3;
    else
    _checked &= !CASE_3;
    }
     
    private void MaCheckBox4_CheckedChanged(object sender, EventArgs e)
    {
    if(MaCheckBox4.Checked)
    _checked |= CASE_4;
    else
    _checked &= !CASE_4;
    }

    L'utilisation d'un enum avec l'attribut Flags peut être très utile aussi.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Le | est un OU binaire (bitwise, bit à bit),
    Pas uniquement : si appliqué à des booléen, c''est un ou logique non optimisé, c'est à dire avec évaluation des deux termes, même si le premier est vrai. C'est spécifique C# (ça n'existe pas dans les autres langages utilisant une syntaxe similaire).

    Cette règle syntaxique (la version "binaire" des opérateurs logiques appliqués à des booléen est un opérateur logique non optimisé) est vraie pour tous les opérateurs logiques en C# (&, |, ^)

    Par exemple, essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    bool func1()
    {
    Console.WriteLine("Call Func1");
    return true;
    }
    bool func2()
    {
    Console.WriteLine("Call Func2");
    return true;
    }
     
    void test()
    {
         Console.WriteLine("Single |");
         bool a = func1() | func2();
         Console.WriteLine("Double |");
         bool b = func1() || func2();
    }
    Citation Envoyé par ctxnop Voir le message
    L'utilisation d'un enum avec l'attribut Flags peut être très utile aussi.
    L'attribut Flag n'a absolument aucune influence sur le comportement de l'enum en terme d'évaluation, et a uiquement une influence sur le ToString et sur la visibilité dans le Debugger (quand on met l'attribut Flag, il "étend" l'affichage aux champs séparés).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        2 : 0010
     OU 4 : 0100
     =  6 : 0110
    Et oui, un OU bit à bit ca donne le même résultat qu'une addition dans certains cas.
    Mais pas dans d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        3 : 0011
     OU 2 : 0010
     =  3 : 0011
    Le | est un OU binaire (bitwise, bit à bit), alors que le || est un OU logique (retourne VRAI si la partie gauche est VRAI ou que la partie droite est VRAI, ces deux parties peuvent être des expressions, un nombre est considéré vrai s'il est différent de 0).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Citation Envoyé par gouroupasdebol Voir le message
    c est un test pour savoir si 66 == 66 ou 2^6 == 66 ?
    ou si (66 ou logique (2^6) == 66 ?
    c'est pour savoir si (66 ou logique (2^6)) == 66

    Le but est d'appliquer un masque sur un integer. Cela permet me permet à partir d'une seule valeur de checked différentes checkboxes dans une windows.form.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/12/2013, 13h01
  2. XOR entre 2 tableaux
    Par Umlist dans le forum C
    Réponses: 11
    Dernier message: 28/06/2012, 22h59
  3. [OpenSSL] Faire un xor entre deux BN
    Par babbab dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 08/01/2011, 15h38
  4. Différences entre 2 int[] arrays ?
    Par Danny Blue dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/11/2007, 23h27
  5. conversion (cast) entre IntPtr int[]
    Par glebourg dans le forum C#
    Réponses: 2
    Dernier message: 29/03/2007, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo