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 :

problème de tableau


Sujet :

C

  1. #21
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    En complément des fonctions données ici http://www.developpez.net/forums/sho...light=IEEE+754 , on peut écrire:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <ctype.h>
     
    static int uint_to_binary_repr(char *s_buffer, size_t buffsize, unsigned int number, size_t nbits);
    unsigned int binary_repr_to_uint(char const *s_buffer, char const **endptr);
     
    int main(void)
    {
        char s_buffer[33];
        char s_buffer2[33];
        unsigned int number, number2, result;
     
        /* Manupulations de bits */
        printf("Manipulations de bits --------------------------\n\n");
        uint_to_binary_repr(s_buffer, sizeof s_buffer, 1, 0);
        printf("La représentation binaire de 1 est: %s\n", s_buffer);
        number = binary_repr_to_uint(s_buffer, NULL);
        uint_to_binary_repr(s_buffer, sizeof s_buffer, ~number + 1, 0);
        printf("Son complément à 2 est: %s\n\n", s_buffer);
     
        /* Manupulations de bits */
        printf("Addition de nombres ----------------------------\n\n");
        uint_to_binary_repr(s_buffer, sizeof s_buffer, 1, 0);
        uint_to_binary_repr(s_buffer2, sizeof s_buffer2, 2, 0);
        number = binary_repr_to_uint(s_buffer, NULL);
        number2 = binary_repr_to_uint(s_buffer2, NULL);
        uint_to_binary_repr(s_buffer, sizeof s_buffer, number + number2, 0);
        result = binary_repr_to_uint(s_buffer, NULL);
        printf("%u + %u = %u\n", number, number2, result);
     
        return EXIT_SUCCESS;
    }
     
     
    /**
     * Fournit la représentation binaire d'un entier non signé de type int unsigned
     * int.
     *
     * @param s_buffer tampon dans lequelle est placé la représentation binaire
     *                 sous la forme d'une chaîne de caractères.
     * @param buffsize taille du tampon
     * @param number entier non signé à représenter sous forme binaire
     * @param nbits nombre de bits utilisés par la représentation. Si nbits est
     *              inférieur au nombre de bits nécessaires, le nombre minimal de
     *              bits nécessaires est utilisé. nbits est majoré par le nombre de
     *              bits utilisés pour représenter un entier de type int.
     *
     * @return code d'erreur valant -1 si la taille du tampon fourni est
     *         insuffisante, et 0 sinon
     */
    int uint_to_binary_repr(char *s_buffer, size_t buffsize, unsigned int number, size_t nbits)
    {
        int err = 0;
        size_t i;
     
     
        unsigned int n = number;
        const size_t MAX_BITS = sizeof number * CHAR_BIT;
        size_t MIN_BITS = 0;
     
        /* Calcul du nombre minimal de bits nécessaires pour représenter
           l'entier considéré */
     
        do
        {
            n /= 2;
            MIN_BITS++;
        }
        while (n > 0u);
     
     
        nbits = (nbits > MAX_BITS) ? MAX_BITS :
                (nbits < MIN_BITS) ? MIN_BITS : nbits;
     
        if (buffsize > nbits)
        {
     
            s_buffer[nbits] = 0;
     
            for (i = 0; i < nbits; ++i)
            {
                s_buffer[nbits-(i+1)] = (number & (1 << i)) ? '1' : '0';
            }
        }
        else
        {
            err = -1;
        }
        return err;
    }
     
    /**
     * Converti la représentation binaire d'un nombre en un nombre non-signé de
     * type unsigned int. La fonction analyse au plus sizeof(unsigned int) * CHAR_BIT
     * bits à partir du bit de poids fort (MSB). Les espaces (caractères
     * reconnus comme tels par isspace()) de tête sont ignorés, et la lecture
     * s'arrête à la rencontre du 1er caractère invalide.
     *
     * @param s_buffer tampon dans lequelle se trouve la représentation binaire à
     *                 convertir en unsigned int
     * @param endptr si endptr n'est pas NULL, l'adresse du 1er caractère invalide
     *               est placée dans *endptr. Si aucun catactère n'est valide,
     *               l'adresse de s_buffer est placée dans *endptr.
     *
     * @return entier non-signé correspondant à la représentation bianire fournie.
     *         Si la valeur 0 est retournée alors que *endptr pointe sur s_buffer,
     *         aucun caractère n'a été lu.
     */
    unsigned int binary_repr_to_uint(char const *s_buffer, char const **endptr)
    {
        unsigned int number = 0;
        char const *pc;
        size_t nbits = 0;
     
        if (s_buffer != NULL)
        {
            /* On ignore les espaces de tête */
            for (pc = s_buffer; isspace(*pc); pc++)
            {
                continue;
            }
            while (nbits < sizeof number * CHAR_BIT && (*pc == '1' || *pc == '0'))
            {
                number = number * 2 + (*pc - '0');
     
                nbits++;
                pc++;
            }
     
            if (endptr != NULL)
            {
                *endptr = (nbits >= 1u) ? pc : s_buffer;
            }
        }
     
        return number;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  2. #22
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par sandball22
    ou est-ce que tu rajoute 1 dans le code précédent? Car a part changer les bits 1 en 0 et vis versa, je ne vois pas ou est l'addition.
    L'addition est faite juste en-dessous du commentaire correspondant!

  3. #23
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Je dois être aveugle alors cars pour moi, en dessous du commenataire on ajoute 1, tu changes justes les bits 1 en 0 et 0 en 1. Le +1 n'est pas fait?

  4. #24
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Tu sais pas faire une addition ? C'est comme à l'école : tu ajoutes à chaque chiffre et tu reportes les retenues :
    0+1 = 1
    1+1 = 0 et une retenue

  5. #25
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par sandball22
    Je dois être aveugle alors cars pour moi, en dessous du commenataire on ajoute 1, tu changes justes les bits 1 en 0 et 0 en 1. Le +1 n'est pas fait?
    Pas exactement. En fait, lorsque vous incrémentez de 1 en binaire, il suffit de partir des bits de poids faible et de changer les 1 en 0 (retenue) jusqu'à tomber sur un 0 que l'on change en 1. Là, il n'y a plus de retenue et l'incrémentation a été effectuée. C'est une bête addition. Regardez plus attentivement le code et vous verrez que c'est ce qui est fait. Demandez si vous ne voyez toujours pas.

  6. #26
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sandball22
    Je dois être aveugle alors cars pour moi, en dessous du commenataire on ajoute 1, tu changes justes les bits 1 en 0 et 0 en 1. Le +1 n'est pas fait?
    Oui, il est fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0001 + 1 = 0010
    0011 + 1 = 0100
    0111 + 1 = 1000
    Cela revient donc à mettre le 1er bit égal à 0 (à partir du bit de poids faible) à 1 et tous les bits précédents à 0. C'est ce qui est fait!

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #27
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Moi ce que je comprends pour faire un complément a 2 de par exemple 101, il faut changer les bits 0 en 1 et 1 en 0. Ici cela devient 010. ENsuite il faut additionner 010+1. Au final j'orais 011.
    Es ce que je me trompe?

    Dans votre code vous fete pas le +1?
    Si vous le faites je ne comprens pas où!

  8. #28
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sandball22
    Moi ce que je comprends pour faire un complément a 2 de par exemple 101, il faut changer les bits 0 en 1 et 1 en 0. Ici cela devient 010. ENsuite il faut additionner 010+1. Au final j'orais 011.
    Es ce que je me trompe?

    Dans votre code vous fete pas le +1?
    Si vous le faites je ne comprens pas où!
    Il suffit de relire les 2 posts ci-dessus, puis de relire le code, et tu comprendras.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #29
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si tu préfères, on peut écrire sans instruction break:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* On met les bits à 0 tant que ceux-ci sont à 1 */
    for (i=0; i < size && tab[i] == '1';++i)
    {
        tab[i]='0';
    }
    /* S'il n'y a pas de débordement, on met le 1er bit 0 trouvé à 1 */
    if (i < size)
    {
        tab[i] = '1';
    }
     
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #30
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    J'ai essayé le code voila ce que j'obtiens:


    phase :111000110101000100001011
    complement a 2:100000000000000000000000

    Cela ne marche pas.

  11. #31
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Je crois savoir pourquoi cela ne marche pas. En effet, le code proposé coreespond à tab[0] le poids faible.Moi c'est l'inverse. Quelle modification je dois faire?

  12. #32
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par sandball22
    J'ai essayé le code voila ce que j'obtiens:


    phase :111000110101000100001011
    complement a 2:100000000000000000000000

    Cela ne marche pas.
    Chez moi, cela fonctionne parfaitement (sur cet exemple du moins ). Faites voir votre code.

  13. #33
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par sandball22
    Je crois savoir pourquoi cela ne marche pas. En effet, le code proposé coreespond à tab[0] le poids faible.Moi c'est l'inverse. Quelle modification je dois faire?
    Il n'y a qu'à inverser votre chaîne!

  14. #34
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Sinon, cela devrait faire l'affaire (au sujet du bit de poids faible):
    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
    void complement2(char *tab,int size)
    /*Ce code suppose que tab[0] correspond au bit de poids fort*/
     {
     int i;
     
     /*On inverse les "bits"*/
     for (i=0;i<size;++i) tab[i]=tab[i]=='0'?'1':'0';
     /*"On ajoute 1"*/
     for (i=size-1;i>=0;--i)
      if (tab[i]=='1') tab[i]='0';
      else
       {
       tab[i]='1';
       break;
       }
     }

  15. #35
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sandball22
    J'ai essayé le code voila ce que j'obtiens:


    phase :111000110101000100001011
    complement a 2:100000000000000000000000

    Cela ne marche pas.
    Chez moi, ça fonctionne (ATTENTION: le bit de poids faible est en tab[0]):
    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
    #include <stdio.h>
     
    /*Ce code suppose que tab[0] correspond au bit de poids faible*/
    static void complement2(char *tab,int size)
    {
        int i;
     
        /*On inverse les "bits"*/
        for (i = 0; i < size; ++i)
        {
            tab[i] = (tab[i]=='0') ? '1' : '0';
        }
     
        /* On ajoute 1 */
        for (i=0;i < size;++i)
        {
            if (tab[i]=='1')
            {
                tab[i]='0';
            }
            else
            {
                tab[i]='1';
                break;
            }
        }
    }
     
    int main(void)
    {
        char s_buffer[] = "111000110101000100001011";
        printf("LSB %s MSB\n", s_buffer);
        complement2(s_buffer, sizeof s_buffer - 1);
        printf("LSB %s MSB\n", s_buffer);
     
        return 0;
    }
    et voilà ce qui retourne le programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LSB 111000110101000100001011 MSB
    LSB 100111001010111011110100 MSB
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  16. #36
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Si je fais cela


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i=0;i<size;++i)
      if (tab[size-i]=='1') tab[size-i]='0';
      else
       {
       tab[i]='1';
       break;
       }
    normalement cela est bon non? Car en pratique non cela me fait l'addition à partir de tab[0] au lieu de de tab[size]

  17. #37
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Je pense que c'est bon.

  18. #38
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    En fait, non j'ai toujours un problème. mon tab[0] corerespond au poids fort alors dans le code proposé c'est le poids faible.

  19. #39
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sandball22
    En fait, non j'ai toujours un problème. mon tab[0] corerespond au poids fort alors dans le code proposé c'est le poids faible.
    Ce code http://www.developpez.net/forums/sho...4&postcount=34 semble résoudre le problème, non?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Débutant en Javascript : problème de tableau !
    Par bluheim dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/11/2005, 15h03
  2. [XHTML] problème de tableau
    Par virgul dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/04/2005, 07h18
  3. Problème de tableau
    Par tom06440 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/04/2005, 20h30
  4. Problème de tableau
    Par krfa1 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/02/2005, 11h09

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