Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

travailler sur du binaire en C


Reika2000

Messages recommandés

On m'a parlé de fonctions permettant de travailler facilement sur le code binaire d'un octet.

J'ai besoin par exemple de pouvoir lire ou modifier facilement une partie du code binaire d'un caractère (encore que pouvoir faire ça pour un entier reviendrait au même). Genre 00010000 => 00000000 en ne touchant qu'au 1, ou lire le 2ème digit d'un nombre entier.

Bon, bien sûr, je peux faire ces fonctions moi même, mais dans la mesure où le code binaire du caractère existe déjà, le retrouver par des décalages binaires me semble peu naturel.

Donc si vous connaissez ce genre de fonctions ou un site en parlant, merci de m'en faire part. Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Il y a ce que l'on appelle des "champs de bits" (c'est pas cochon !)

 

exemple de déclaration (tiré du K&R) :

struct {

unsigned int est_mot_cle : 1;

unsigned int est_externe : 1;

unsigned int est_statique : 1;

} drapeaux;

Cela créé 3 champs de 1 bit chacun.

 

Ensuite tu utilises les champs comme etant des champs de la structure drapeaux.

 

Mais trés franchement, je ne vois pas en quoi l'utilisation de l'algebre de bool pour travailler sur les bits te derange. C'est fait pour et bien plus souple que l'utilisation des "champs de bits".

 

Pour ton exemple de 00010000 => 00000000 suffit de faire un :

mon_octet &= ~ 0x10;

 

Pour lire le 2eme digit (de poid fort) :

mon_digit = (mon_octet >> 6) & 1;

 

Automne

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ces réponses.

Je t'avoue que je ne comprends pas comment concrètement je peux me servir du champ de bits. Je dois manuellement (donc décomposer le caractère pour) remplir chacun des champs ? Pour cette question, je vais essayer de me documenter, je ne connaissais pas ces champs de bits (marrant le nom, quand même).

 

En revanche, je n'avais pas envisagé les décalages de la même façon que toi, c'est pour ça que je ne pensais pas les utiliser (en fait, je ne les ai jamais utilisé vraiment, pour moi c'était juste une division par 2^x simplifiée et rapide). Mais autant je comprends la lecture, autant je ne comprends pas ton écriture. Le 0x10 veut dire 10 en binaire, si je me plante pas, donc 01001000 (poids fort à droite), donc je vois pas trop comment tu écrits ce que tu veux écrire. Mais de toute façon, je ne comprends pas du tout l'opération.

Sinon, je ne suis pas sûr d'avoir été clair pour l'écriture: je veux écrire un 1, par exemple, au 5ème bits du code binaire égal à un entier (enfin un char). Peut-être que tu réponds à ça, d'ailleurs, mais j'en suis pas sûr.

 

Désolé d'abuser un peu et merci encore pour ton aide. Je vais rechercher sur le net, de toute façon, histoire de pas attendre que ça tombe tout cuit.

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ces réponses.

Je t'avoue que je ne comprends pas comment concrètement je peux me servir du champ de bits. Je dois manuellement (donc décomposer le caractère pour) remplir chacun des champs ? Pour cette question, je vais essayer de me documenter, je ne connaissais pas ces champs de bits (marrant le nom, quand même).

Pour les champs de bits, j'ai jamais trop utilisé donc je ne voudrais pas dire de bétises :P Mais tu dois pouvoir faire une union entre ta structure de données et la structure de champ de bits pour pouvoir travailler sur les memes données avec les 2 structures. Gaffe au cadrage des champs dans la structure tout de meme !

 

En revanche, je n'avais pas envisagé les décalages de la même façon que toi, c'est pour ça que je ne pensais pas les utiliser (en fait, je ne les ai jamais utilisé vraiment, pour moi c'était juste une division par 2^x simplifiée et rapide). Mais autant je comprends la lecture, autant je ne comprends pas ton écriture. Le 0x10 veut dire 10 en binaire, si je me plante pas, donc 01001000 (poids fort à droite), donc je vois pas trop comment tu écrits ce que tu veux écrire. Mais de toute façon, je ne comprends pas du tout l'opération.

Non 0x10 en C c'est 10 en Hexadecimal. 0x10 = 00010000 binaire

 

Sinon je ne comprend pas ce qui te gene. Je reprend les opérateurs :

& (ET)

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

 

| (OU)

1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0

 

~ (XOR ou OU Exclusif)

1 ~ 1 = 0

1 ~ 0 = 1

0 ~ 1 = 1

0 ~ 0 = 0

 

! (NOT)

!1 = 0

!0 = 1

 

Sinon, je ne suis pas sûr d'avoir été clair pour l'écriture: je veux écrire un 1, par exemple, au 5ème bits du code binaire égal à un entier (enfin un char). Peut-être que tu réponds à ça, d'ailleurs, mais j'en suis pas sûr.

Alors je reprend :

Si tu veux mettre le Neme bit d'un octet à 0 (avec N = 0 pour le bit de poid faible), il faut que tu fasses :

unsigned char mask, mon_octet;

mask = 1 << N;

mon_octet &= ~ mask;

 

si tu veux mettre le Neme bit d'un octet à 1 (avec N = 0 pour le bit de poid faible), il faut que tu fasses :

unsigned char mask, mon_octet;

mask = 1 << N;

mon_octet |= mask;

 

Automne

Lien vers le commentaire
Partager sur d’autres sites

En fait, je ne connaissais pas le XOR en C, donc le ~ m'apparaissait comme bien mystérieux.

 

Ok, je comprend mieux tes interogations :-P

C'est vrai que cet operateur est rarement utilisé à part pour ce genre de choses.

 

:P  Vous me donner mal a la tete avec vos trucl  :-(

Oui, j'admet que pour un non programmeur, ca doit ressembler à du chinois ce genre de choses :-P Désolé :-P

 

Automne

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...