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 :

Manipulation des bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut Manipulation des bits
    Bonjour a vous tous,

    Voila je souhaite manipuler des unsigned char et faire des opérations dessus mais je rencontre pas mal de problème

    Je souhaite soustraire un tableau d'unsigned char les uns avec les autres c'est a dire Xi - X(i-1)
    Donc si les deux ne font pas de dépassement tout va bien, mais si la soustraction me donne un résultat négatif et que je le soustrait avec le suivant que dois je faire pour les le remettre en unsigned char? Faire un complement a deux?

    Mes fonctions sont elles bien adaptées?
    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
    typedef unsigned char uchar;
     
    enum {FALSE, TRUE};
    int Bit(uchar x, int pos)
    {
    return (x>>pos)&1;
    }
     
    int Add(uchar x, uchar y)
    {
     uchar bx,by;
     int i=0, som =0;
     int ret = 0;
     while (i<(sizeof(char)*7))
       {
        bx = Bit(x,i);
        by = Bit(y,i);
        som = som | (bx^by^ret)<<i;
        ret = (bx|by)&(bx|ret)&(by|ret);
        i++;
       } 
     bx = Bit(x,i);
     by = Bit(y,i);
     return som;
    }
     
    int Sous(uchar x, uchar y)
    {
     y = Add(~y, 1);
     return Add(x, y);
    }
     
    int EstNegatif (uchar x)
    {
     if (Bit(x,8)==0)
      return FALSE;
     else return TRUE;
    }
    Le résultat que je vais trouver peut être sur n+1 bits, comment dois je faire pour le remettre sur n bits? avec un modulo 254?

    Merci pour vos futures réponses

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    BatuBou :
    mais si la soustraction me donne un résultat négatif et que je le soustrait avec le suivant que dois je faire pour les le remettre en unsigned char? Faire un complement a deux?
    Il est évident que dans ce cas, tu ne peux mettre le résultat en unsigned char en conservant la valeur. Donc, tout dépend de ce que TU veux faire dans ce cas. mettre la valeur absolue du nombre (complément à deux puis stockage) ou stocker directement dans un unsigned char, auquel cas le comportement du compilateur fait qu'il prendra un modulo 256 pour ramener la valeur entre 0 et 255 (si tes char sont sur 8 bits)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci pour votre reponse, mais je dois avouer que j'ai du mal a comprendre les operations sur les bits.

    J'ai fait une fonction pour afficher mes unsigned char, quand je lui demande de m'afficher uchar c = 251; il m'affiche 0 11111011.

    Pour savoir si il est negatif ou non je dois donc tester le 8ieme bit?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void UcharToBin(uchar c){
    	int i;
     
    	for(i = sizeof(char)*CHAR_BIT -1; i>=0 ;i--){
    		if((c&(1<<i)) == 0) printf ("0");
    		else printf("1");
    		if(!(i%CHAR_BIT)) printf("  ");
    	}
    	printf("\n");
    }
    Avec ma fonction Sous quand je fais Sous(251,254) il me renvoie 125

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un nombre unsigned n'est jamais négatif, par définition (uchar)251 correspond à (char)-5.
    Et ta fonction affiche un bit de trop.


    Si tu veux pouvoir utiliser des char négatifs, tu n'auras pas de nombre supérieur à 127.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Non en fait je veux utiliser la soustraction sur des unsigned char, mais comme le resultat va donner des entiers signés sur n + 1 bit je souhaite les ramener dans un premier temps a des unsigned char et dans un second temps les ramener sur n bits, c'est pour faire un codage differentiel sur des images...

    Desolé d'insister mais je ne comprends pas du tout la manipulation des bits

    Merci encore pour votre aide

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    SI tu veux soustraire 251, je te conseille de le convertir en un entier de taille supérieure ou égale à 9 bits et de lui donner la valeur -251.
    Ensuite, tu n'auras plus qu'à en faire une addition sur 9 bits, et ignorer la retenue (le 10e bit)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par BatuBou
    Non en fait je veux utiliser la soustraction sur des unsigned char, mais comme le resultat va donner des entiers signés sur n + 1 bit je souhaite les ramener dans un premier temps a des unsigned char et dans un second temps les ramener sur n bits
    Tu veux noyer une carpe ou quoi? Un nombre non signé par essence ne peut pas être négatif que veux-tu de plus. La plage des valeurs possibles que peut prendre un unsigned char si sa taille est de 8 bits est 0 - 255. A l'intérieur de l'ordinateur les données sont représentées sous forme binaire. Si je te demandes par exemple : que représente 10001010. Que vas tu répondres? Un entier (signé ou non signé)? Un flottant? Une adresse? Un caractère? Une couleur? Une position? ... C'est à toi de faire l'intérprétation que tu veux mais vu d'un signed char ça vaut peut-être -118, vu d'un unsigned char c'est 138, etc. Et réciproquement si tu affectes 138 ou -118 etc. à un unsigned char tu auras le même résultat : 138! Soit 10001010. Les opérateurs de manipulation de bits permettent de manipuler les données au niveau des bits, sans aucune interprétation quelconque. Pour faire des opérations de décalage << ou >>, il vaut mieux toujours utiliser des entiers non signés (je rappellme qu'un caractère est aussi un entier) car le résultat de l'opération avec des entiers signés est dépendant de l'implémentation (à cause de la représentation des nombres négatifs).

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

Discussions similaires

  1. fonction de manipulation des bits
    Par hadiya dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/03/2014, 14h02
  2. manipulation des bits
    Par deMonHunTer dans le forum C
    Réponses: 9
    Dernier message: 12/01/2010, 22h11
  3. Manipulation des bits
    Par JLC83 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2010, 13h33
  4. Manipuler des bits
    Par line86 dans le forum C
    Réponses: 9
    Dernier message: 21/10/2007, 21h18
  5. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51

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