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 :

Comportement du & logique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Par défaut Comportement du & logique
    Salut à vous!

    Voila j'ai en c un petit bout de code tout bête qui a pour but, à partir d'une variable, d'afficher sa valeur en binaire.
    Pour ce faire, j'ai une boucle de 32 itérations comme la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int a = 1;
    int i = 0;
     
    for(i=31; i >=0; i--){
    	printf("%d ", a & (0x1 << i));
    }
    Cela fonctionne parfaitement mais une chose ne me semble pas claire et j'aimerai que l'on m'explique une chose:

    Supposons que ma variable A ait pour valeur 2 soit 10 en binaire.


    Arrivé à l'itération ou i vaut 1, j'effectue donc un et logique entre ma valeur 2 et elle même soit 10 & 10 = 10 soit 2 en décimal.

    Or quand j'affiche avec mon printf la valeur de retour( a & (0x1 << 1) ), j'obtient bien un 1 (ce qui au final me convient) mais qui ne correspond pas au final à ce que j'estime avoir calculé (la valeur 2).

    Quelqu'un pourrait m'expliquer pourquoi cela se comporte ainsi?

    Merci pour vos réponses!

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Voldo Voir le message
    Or quand j'affiche avec mon printf la valeur de retour( a & (0x1 << 1) ), j'obtient bien un 1 (ce qui au final me convient)
    Pas moi.

    mais qui ne correspond pas au final à ce que j'estime avoir calculé (la valeur 2).
    C'est bien que je j'obtiens.

    (En passant, il vaut mieux ne pas faire des opérations binaires sur des nombres signés).

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Par défaut
    Salut et merci pour vos réponses.

    Envoyé par Voldo Voir le message
    Or quand j'affiche avec mon printf la valeur de retour( a & (0x1 << 1) ), j'obtient bien un 1 (ce qui au final me convient)
    Pas moi.

    C'est très bizzar mais je ne suis pas fou, j'obtient bien la valeur 1 serait-ce lié au pc ou au systeme?

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Voldo
    C'est très bizzar ...
    En effet !

    Pour obtenir ce que tu veux c'est plus quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d ", (a>>i) & 0x1 );
    ou en gardant ta formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d ", ((a & (0x1 << i))!=0));

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Par défaut
    Bonjour!

    Apres verif je n'ai pas ce comportement avec mon pc portable c'est vraiment bizzar

    Sinon merci beaucoup pour vos réponses

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Nei,

    1 décimal = 1 binaire, pas 10 (10 binaire = 2 décimal).

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

Discussions similaires

  1. [AC-2007] Différence de comportement tri / opérateur logique
    Par rami_rezi dans le forum VBA Access
    Réponses: 8
    Dernier message: 29/03/2012, 18h34
  2. Traduire une expression logique en comportement de bouton
    Par mamax29 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/10/2011, 09h06
  3. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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