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 :

Addition binaire


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de bj303931
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 75
    Points : 27
    Points
    27
    Par défaut Addition binaire
    Bonjour, j'essaye de faire une additon en c en passant par le binaire.

    Le schéma de l'additionneur est: Nom : 286px-Half-adder.svg.png
Affichages : 2621
Taille : 6,6 Ko

    L'équation logique est donc: (a XOR b) OU (a ET b) avec a et b les nombres à additionner.

    Or, ce code renvoye 3 au lieu de 5.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    unsigned int add (unsigned int a, unsigned int b){
    return a^b|a&b;}
     
    void main(){
    int r = add(2,3);
    printf("%d", r);
    }

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 469
    Points : 6 102
    Points
    6 102
    Par défaut
    Bonjour.

    Citation Envoyé par bj303931 Voir le message
    L'équation logique est donc: (a XOR b) OU (a ET b) avec a et b les nombres à additionner.
    Non.

    Soient a et b deux entiers naturels. Soit s = a + b.
    Soient (a0, a1, a2, ...) les bits de a, a0 étant le bit de poids faible.
    Soient (b0, b1, b2, ...) les bits de b, b0 étant le bit de poids faible.
    Soient (s0, s1, s2, ...) les bits de s, s0 étant le bit de poids faible.
    On veut connaître les bits de s.

    On a :
    s0 = a0 XOR b0
    s1 = a1 XOR b1 XOR c0 avec c0 = a0 ET b0 la retenue pour l'itération 0.
    s2 = a2 XOR b2 XOR c1 avec c1 = (a1 ET b1) OU (a1 ET c0) OU (b1 ET c0) la retenue pour l'itération 1.

    De manière générale, pour tout entier k supérieur ou égal à 1 :
    sk = ak XOR bk XOR ck-1 avec ck-1 la retenue de l'itération k-1.
    ck = (ak ET bk) OU (ak ET ck-1) OU (bk ET ck-1)

    Plus de détails sur Wikipédia :
    https://fr.wikipedia.org/wiki/Additionneur

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pourquoi prendre soin d'utiliser des unsigned int dans ta fonction d'addition si c'est pour utiliser un int signé dans la fonction main ?....

    Au hasard, je pencherai pourune question de priorité des opérateurs. Ton calcul est donné avec des parenthèses, mais elles disparaissent dans ta traduction en C.

  4. #4
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 469
    Points : 6 102
    Points
    6 102
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Au hasard, je pencherai pour une question de priorité des opérateurs.
    Le ET bit à bit est prioritaire sur le XOR bit à bit qui est prioritaire sur le OU bit à bit, donc a^b|a&b équivaut bien à (a^b)|(a&b).
    http://en.cppreference.com/w/cpp/lan...tor_precedence

    Le problème de fond, c'est que (a^b)|(a&b) n'a rien à voir avec a+b.
    En fait, (a^b)|(a&b) équivaut à a|b.

  5. #5
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    on peut considérer ça comme des opérations sur des vecteurs de bits ...

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
     
    void bitvector_add(uint32_t a, uint32_t b, uint32_t *add, uint32_t *carry);
    uint32_t uint32_add(uint32_t a, uint32_t b);
     
    void bitvector_add(uint32_t a, uint32_t b, uint32_t *add, uint32_t *carry)
    {
      *add=a^b;
      *carry=a&b;
    }
     
    uint32_t uint32_add(uint32_t a, uint32_t b)
    {
      uint32_t add;
      uint32_t carry;
     
      do {
        bitvector_add(a,b,&add,&carry);
        a=add;
        b=carry<<1;
      } while (b!=0);
     
      return a;
    }
     
    int main(void)
    {
      uint32_t a,b;
     
      printf("a=");
      scanf("%"SCNu32, &a);
     
      printf("b=");
      scanf("%"SCNu32, &b);
     
      printf("a+b=%"PRIu32"\n", uint32_add(a,b));
     
      return 0;
    }

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    Le ET bit à bit est prioritaire sur le XOR bit à bit qui est prioritaire sur le OU bit à bit, donc a^b|a&b équivaut bien à (a^b)|(a&b).
    http://en.cppreference.com/w/cpp/lan...tor_precedence

    Le problème de fond, c'est que (a^b)|(a&b) n'a rien à voir avec a+b.
    En fait, (a^b)|(a&b) équivaut à a|b.
    Arf... J'étais parti du postulat que la formule était bonne.... Un problème de priorité etait donc la seule possible erreur.

    Après avoir posté je me suis dit que c'était bizarre car il me semblait que le OU avait une priorité faible. Ce que tu confirmes

  7. #7
    Nouveau membre du Club Avatar de bj303931
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 75
    Points : 27
    Points
    27
    Par défaut Ca ne marche toujours pas...
    Merci, pour toutes vos idées. J'ai essayé de les mettre bout à bout mais ça ne marche toujours pas...

    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
    #include <stdio.h>
     
    void addi (int a, int b, int *add, int *r){
            *add=a^b^*r;
            *r=a&b|a&*r|b&*r;
                    }
     
    int addition (int a, int b){
            int add;
            int r;
            while(b!=0){addi(a, b, &r, &add);
                    a=add;
                    b=r<<1;}
            return a;}
     
    void main(){
    int r = addition(2,3);
    printf("%d", r);
    }
    Celui-ci renvoie 2 au lieu de 5.

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Lecture de variable non initialisée, le résultat est indéfini.

  9. #9
    Nouveau membre du Club Avatar de bj303931
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 75
    Points : 27
    Points
    27
    Par défaut Ca ne marche toujours pas...
    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
    #include <stdio.h>
     
    void addi (int a, int b, int *add, int *r){
            *add=a^b^*r;
            *r=a&b|a&*r|b&*r;
                    }
     
    int addition (int a, int b){
            int add=0;
            int r=0;
            while(b!=0){addi(a, b, &r, &add);
                    a=add;
                    b=r<<1;}
            return a;}
     
    void main(){
    int r = addition(2,3);
    printf("%d", r);
    }
    Aucun changements.

  10. #10
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 469
    Points : 6 102
    Points
    6 102
    Par défaut
    C'est normal que ça ne marche pas.
    Tu ne peux pas fusionner au hasard mes formules avec celles qui sont dans l'algorithme utilisé par picodev.

    L'algorithme utilisé par picodev se base sur l'égalité suivante :
    a + b == (a^b) + ((a&b)<<1)

    Dans la boucle de l'algorithme utilisé par picodev, à chaque itération, on remplace a par a^b et b par (a&b)<<1.
    Ainsi, la valeur de a + b est inchangée.
    La boucle s'arrête quand b == 0, c'est-à-dire quand a contient la somme des entiers naturels a et b de départ.

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Autre

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<stdio.h>
    #include<conio.h>
    void main()
    {
      clrcsr();
      int a,b:
      a=2,b=3;
      c=a^b||a&b;
      printf("the value of c ="&c);
      scanf("%d%d",&c&c);
      getch();
    }

Discussions similaires

  1. addition binaire
    Par hbenji dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 21/02/2011, 22h58
  2. Exercice d'addition binaire
    Par ratec dans le forum Pascal
    Réponses: 17
    Dernier message: 06/12/2010, 22h46
  3. Addition binaire
    Par demha dans le forum Pascal
    Réponses: 3
    Dernier message: 06/04/2007, 19h59
  4. Réponses: 30
    Dernier message: 23/08/2006, 21h53
  5. Addition binaire
    Par mguinot dans le forum Langage
    Réponses: 1
    Dernier message: 24/02/2006, 10h22

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