Aller au contenu
Reika2000

travailler sur du binaire en C

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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×