Aller au contenu


Photo
- - - - -

travailler sur du binaire en C


  • Veuillez vous connecter pour répondre
19 réponses à ce sujet

#1 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 22 avril 2002 - 09:15

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.
  • 0

PUBLICITÉ

    Annonces Google

#2 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 22 avril 2002 - 10:17

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
  • 0

#3 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 22 avril 2002 - 11:09

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.
  • 0

#4 KewlCat

KewlCat

    Modérateur

  • Attente Validation
  • 24 812 messages

Posté 22 avril 2002 - 11:17

il faut utiliser les opérateurs binaires & et | (alias "et" et "ou")
pour simplifier l'exemple d'automne :

tester (mon_octet >>6) & 1
revient à tester mon_octet & 0x1000000

Tu as besoin de quoi, exactement ?
  • 0

#5 KewlCat

KewlCat

    Modérateur

  • Attente Validation
  • 24 812 messages

Posté 23 avril 2002 - 12:23

Ouh, il est tard, je raconte n'importe quoi... 0x00100 c'est la notation hexadécimale, non ?
Bon, je vais me coucher, j'en ai assez dit pour aujourd'hui !
  • 0

#6 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 23 avril 2002 - 12:23

Précisément, des outils pour écrire une bitmap (exactement, le ième bit indique si le block i est libre ou occupé) dans fichier texte et pouvoir la lire et la corriger.
  • 0

#7 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 23 avril 2002 - 01:47

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
  • 0

#8 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 23 avril 2002 - 09:11

En fait, je ne connaissais pas le XOR en C, donc le ~ m'apparaissait comme bien mystérieux.
Bon, avec tout ça, je devrais pouvoir me débrouiller, merci encore, et merci aussi pour le récapitulatif.
  • 0

#9 DraZarD

DraZarD

    Extrem Member

  • Membres
  • 781 messages

Posté 23 avril 2002 - 09:57

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

#10 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 23 avril 2002 - 10:31

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
  • 0









Sujets similaires :     x