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 de bits


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut Manipulation de bits
    Salut !

    Je cherche à savoir comment je peux faire pour comparer 3 unsigned char bit à bit, et de stocker un bit dans une variable.
    J'ai déjà essayé quelques trucs avec les opérateurs de bit, mais dans mes variable qui sont censées prendre les bits, j'ai des 2 et 4 x)

    Quelqu'un connaitrait un moyen simple de faire cela ?

    Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    Salut !

    Je cherche à savoir comment je peux faire pour comparer 3 unsigned char bit à bit,
    Salut
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned char x;
    unsigned char y;
    unsigned char z;
    if (x == y && x == z) printf("tous les bits sont identiques\n");

    Citation Envoyé par Raikyn Voir le message
    et de stocker un bit dans une variable.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char x;
    unsigned char y;
    x=y;  // Chaque bit de y sera stocké dans x

    Citation Envoyé par Raikyn Voir le message
    J'ai déjà essayé quelques trucs avec les opérateurs de bit, mais dans mes variable qui sont censées prendre les bits, j'ai des 2 et 4 x)
    Sois plus explicite stp...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    Salut !
    Bonsoir,

    Citation Envoyé par Raikyn Voir le message
    Je cherche à savoir comment je peux faire pour comparer 3 unsigned char bit à bit
    Qu'est-ce que cela signifie, une comparaison bit à bit ?

    Citation Envoyé par Raikyn Voir le message
    et de stocker un bit dans une variable.
    Pour positionner un bit en particulier, on peut utiliser l'opérateur OU binaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable |= (1 << position);
    Citation Envoyé par Raikyn Voir le message
    J'ai déjà essayé quelques trucs avec les opérateurs de bit, mais dans mes variable qui sont censées prendre les bits, j'ai des 2 et 4 x)
    D'un autre côté, si tu positionnes le deuxième et le troisième bit et que tu tentes d'afficher le résultat, c'est normal que tu obtiennes « 2 » ou « 4 ». Tu peux te servir d'une fonction pour afficher ton nombre en base binaire, par exemple :

    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
    #include <limits.h>
    #include <stddef.h>
     
    void 
    print_binary (int x)
    {
    #define GET_BIT(x, i) (((x >> i) & 0x01)
     
      size_t size = sizeof x * CHAR_BIT;
      size_t i;
     
      for (i = 0; i < size; i++)
          printf ("%d\n", GET_BIT (x, size - i - 1));
     
      putchar('\n');
    }
    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Yo, merci pour les réponses.
    Mais il semblerait que je n'ai pas été assez précis sur ce que je devais faire.

    En fait, j'ai un fichier txt que je dois coder, bruiter puis decoder. Le codage utilisé est trivial-3 (c'est-à-dire, on répète 3 fois chaque caractères).
    Là je travaille sur le décodage, et ma fonction prend en arguments 3 caractères et doit faire ressortir le bon.

    Voici le code pour "bruiter" les donné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
    int tire(double p)
    { // vaut 1 avec proba p pourcents
      //  return ( ((rand() * 100.0)/RAND_MAX) < p) ;
      return ((double)rand() / (double)RAND_MAX) * 100.0 < p ;
    }
     
    void bruiter (unsigned char *in, unsigned char *out, double p)
    {
      int i,j;
      for(i=0; i<T_CODE; i++)
        {
          out[i] = in[i];
          for(j=0;j<8;j++)
    	{
    	  if(tire(p))
    	    out[i] = out[i] ^ (1UL << j);
    	}
        }
    }
    On nous a dit qu'il fallait regarder au niveau des bits pour trouver ceux qui n'ont pas d'erreurs.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    Yo, merci pour les réponses.
    Mais il semblerait que je n'ai pas été assez précis sur ce que je devais faire.
    Moui, c'est en effet l'impression qui ressort de nos réponses...

    Citation Envoyé par Raikyn Voir le message
    En fait, j'ai un fichier txt que je dois coder, bruiter puis decoder. Le codage utilisé est trivial-3 (c'est-à-dire, on répète 3 fois chaque caractères).
    Là je travaille sur le décodage, et ma fonction prend en arguments 3 caractères et doit faire ressortir le bon.
    Et que se passe-t-il si les 3 caractères sont différents ? Lequel sera "le bon" ?
    Sinon à la base jusqu'ici pas besoin de travailler au niveau des bits. Si 2 caractères sont identiques on peut supposer qu'ils sont "bons" et que c'est le 3° qui a foiré...
    Citation Envoyé par Raikyn Voir le message
    On nous a dit qu'il fallait regarder au niveau des bits pour trouver ceux qui n'ont pas d'erreurs.
    Euh oui mais c'est à condition que les bits aient été volontairement altérés pour indiquer les erreurs. Exemple le "codage de Hamming" où chaque octet ayant un rang pile poil égal à une puissance parfaite de 2 (rang 1, 2, 4, 8, 16, etc...) sert à contrôler les octets dont le rang écrit en base 2 possède un "1" associé au bit de contrôle. Ainsi l'octet 1 (001) contrôlera tous les octets impairs. L'octet 2 (010) contrôlera les octets 1, 2, 3, 6, 7, 10, 11 (bref tous les octets dont le rang écrit en base 2 contient un "1" en avant dernière position). L'octet 4 (100) contrôlera tous ceux dont le rang écrit en base 2 contient un "1" en avant-avant dernière position etc. Ainsi si un bit change entre l'émission et la destination, le simple calcul de différence converti en binaire donnera instantanément le rang de l'octet ayant changé...

    Là, apparemment, tu travailles avec des "caractères" (enfin c'est ce qu'il me semble) et donc même si un caractère diffère d'un autre par un bit, je ne vois pas trop en quoi connaitre le bit qui diffère change quelque chose à ta façon de faire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Ok je vais juste comparé les caractères eux-mêmes, après je dois faire Hamming de toute façon donc je verrai cette manip de bits ^^

    Encore merci et à bientôt.

Discussions similaires

  1. manipulation de bits d'un byte
    Par orelero dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2008, 10h41
  2. word_t et Manipulation de bits
    Par fmichael dans le forum C#
    Réponses: 2
    Dernier message: 19/03/2007, 09h33
  3. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51
  4. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    Réponses: 2
    Dernier message: 14/06/2006, 11h57
  5. Manipulation de bits
    Par Tsly dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2005, 12h41

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