Isoler les bits d'un octets [Débutant inside]

Isoler les bits d'un octets [Débutant inside] - C++ - Programmation

Marsh Posté le 07-04-2005 à 17:41:45    

Salut a tous !!
 
J'ai une valeur que je choppe sur 0x379, soit le port parallele.
C'est donc un octet.
Pour une utilisation plus aisée, j'aurais voulu séparer et mettre chaque bit de l'octet, dans une variable propre.
Mais comment faire? Etant débutant en C++ je m'en remet a vous !
 
Merci beaucoup d'avance !!!
 
 


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 17:41:45   

Reply

Marsh Posté le 07-04-2005 à 17:45:58    

une variable pour un bit ? mais pourquoi diantre faire ça ? [:mlc]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-04-2005 à 17:49:36    

tu peux pas. utilise les opérateur bit à bit : &, |, ^, ~

Reply

Marsh Posté le 07-04-2005 à 17:49:46    

c'est clair !!!
Tu recupere le tout et apres tu masque pour recuperer seulement ce qui t'interesse


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
Reply

Marsh Posté le 07-04-2005 à 17:53:38    

Taz a écrit :

tu peux pas. utilise les opérateur bit à bit : &, |, ^, ~


sans oublier << et >> qui risquent aussi de lui etre utiles


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-04-2005 à 17:54:16    

Citation :

une variable pour un bit ? mais pourquoi diantre faire ça ? [:mlc]


Heu... ben moi je disais ca comme ca, c'était pour vous faire pigé ce que je voulais avec des notions connue de tous  :)  
 
Je vais regarder pour le masquage merci !
Avec quels termes je suis le plus succeptible de trouver avec Google. Comment ca s'apelle cette méthode en fait ?
 
Merci bcp !!


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 17:55:27    

Ne mets pas un bit par variable, c'est du gaspillage... utilise un masque avec un ET binaire. Exemple

Code :
  1. inline char getValeurOrdreN(char octetAAnalyser, char n)
  2. {
  3.    return (octetAAnalyser & (1 << n));
  4. }
  5. void exemple()
  6. {
  7.    std::cout << getValeurOrdreN( 9, 3 ); // renverra 8
  8. }


Explication :
1 << n : décale n fois 1 vers la gauche afin d'obtenir le bit que tu veux, dans l'exemple ça correspond à 2^3=8
octetAAnalyser & 8 : renvoit 8 parce que le ET renvoit uniquement les bits qui sont mis à 1 dans les 2 opérandes:

octetAAnalyser(9):  1001
& N = 1 << 3 :      1000
                  = 1000


Reply

Marsh Posté le 07-04-2005 à 18:33:19    

Citation :

renvoit 8 parce que le ET renvoit uniquement les bits qui sont mis à 1 dans les 2 opérandes


 
C'est pour ca que le masque le doit comporter qu'un seul bit a 1 ?
 
Ce que je ne comprends pas c'est pourquoi on se déplace vers la gauche ?


Message édité par oZen le 07-04-2005 à 18:35:13

---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 18:34:56    

Non, c'était un masque exemple. Le masque te permet de vérifier si une valeur est définie dans un (ou plusieurs) octet(s).
 
Edit : en relisant, l'exemple est un peu incomplet et peut-être mal adapté à ce que tu veux faire. Peut-être celui-là sera un peu plus clair:

Code :
  1. const char unFlag=6;
  2. inline char mask(char octetAAnalyser, char flag)
  3. {
  4.    return (octetAAnalyser & flag);
  5. }
  6. void exemple()
  7. {
  8.    if( mask(7, unFlag) == unFlag )
  9.       std::cout << "unFlag est actif dans 7";
  10.    else
  11.       std::cout << "unFlag est inactif dans 7";
  12.    if( mask(8, unFlag) == unFlag )
  13.       std::cout << "unFlag est actif dans 8";
  14.    else
  15.       std::cout << "unFlag est inactif dans 8";
  16. }


A la sortie on aura :  
unFlag est actif dans 7 puisque


           7 = 0111
ET unFlag(6) = 0110
             = 0110


 
unFlag est inactif dans 8     puisque


           8 = 1000
ET unFlag(6) = 0110
             = 0000


Message édité par IrmatDen le 07-04-2005 à 18:45:34
Reply

Marsh Posté le 07-04-2005 à 18:35:24    

oZen a écrit :

Citation :

renvoit 8 parce que le ET renvoit uniquement les bits qui sont mis à 1 dans les 2 opérandes


 
C'est pour ca que le masque le doit comporter qu'un seul bit a 1 ?

pas forcément, si tu veux conserver les bits 3 et 7 d'un octet, tu masques comme ceci :
 
octet & 0x88 (= 10001000 en binaire)


Message édité par Harkonnen le 07-04-2005 à 18:35:42

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-04-2005 à 18:35:24   

Reply

Marsh Posté le 07-04-2005 à 18:41:45    

Mais pour moi c'est parfait un seul bit donc c'est cool !


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 18:48:09    

oZen a écrit :

Ce que je ne comprends pas c'est pourquoi on se déplace vers la gauche ?


Ben c'est vrai que la c'était pas très adapté  :sweat: . C'est juste que ça te permet de vérifier si tel ou tel bit est activé sans avoir à l'avance une liste de flag

Reply

Marsh Posté le 07-04-2005 à 18:52:41    

OK, ben c'est nikel !
 
Merci pour ce petit cours bien sympa !


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 19:43:53    

on est en C++ ?? alors pourquoi pas std::bitset ? (ou peut etre meme std::vector<bool> )

Reply

Marsh Posté le 07-04-2005 à 19:54:22    

skelter a écrit :

alors pourquoi pas std::bitset


Je connaissais pas, je vais voir ça...
 

skelter a écrit :

ou peut etre meme std::vector<bool>


Cette solution occuperait peut-être "trop" d'espace, les bool occupant 1 octet, sans compter que de toute façon, il faudrait les extraire...

Reply

Marsh Posté le 07-04-2005 à 19:56:51    

IrmatDen a écrit :


Cette solution occuperait peut-être "trop" d'espace, les bool occupant 1 octet, sans compter que de toute façon, il faudrait les extraire...


 
std::vector<bool> est une specialisation (au niveau du type) de std::vector
 
http://www.sgi.com/tech/stl/bit_vector.html

Reply

Marsh Posté le 07-04-2005 à 20:05:33    

aprés test, sur gcc et sans paramétrer la classe bitset<> ça m'alloue des blocs de 4 octets(essayé avec 8, 12, 32 bits = occupe 4 octets et 48 bits = occupe 8 octets).
L'allocation mémoire est-elle personalisable ?
 
Edit: j'avais pas vu ton poste précédent, bonne classe à connaître...


Message édité par IrmatDen le 07-04-2005 à 20:06:52
Reply

Marsh Posté le 07-04-2005 à 20:15:22    

IrmatDen a écrit :

aprés test, sur gcc et sans paramétrer la classe bitset<> ça m'alloue des blocs de 4 octets(essayé avec 8, 12, 32 bits = occupe 4 octets et 48 bits = occupe 8 octets).
L'allocation mémoire est-elle personalisable ?
 
Edit: j'avais pas vu ton poste précédent, bonne classe à connaître...


 
 
ce n'est pas vraiment le but, comme tu t'en doutes bitset est implementer avec un tableau d'entier vu que la taille peut etre resolu à la compilation

Reply

Marsh Posté le 07-04-2005 à 20:19:46    

J'aurais dû y réfléchir avant de poser la question... systeme 32bits donc 4 octets :whistle:

Reply

Marsh Posté le 07-04-2005 à 21:32:55    

Heu... chuis désolé c'est le retour du noobie ! (nom de code de l'episode 3 Star Wars ;))
 
g ca:

Code :
  1. if (0x41 & 0x80 == 0x80) { cout << "Le dernier bit est a 1";}


 
donc, si j'ai bien compris: 65 et 128 ou
 
      01000001
    &10000000
      00000000
 
Pourtant ca marche pas, la phrase s'affiche.
Et de plus le compilateur me dit "la condition is always true"
la condition est toujours vraie ! arf !
 
Need help !
 
Merci encore pour votre aide, chuis noob sorry...


Message édité par oZen le 07-04-2005 à 21:34:28

---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 21:35:34    

Et si tu fais :

Code :
  1. if ( (0x41 & 0x80) == 0x80) { cout << "Le dernier bit est a 1";}

Reply

Marsh Posté le 07-04-2005 à 21:49:18    

cette fois j'ai 2 warnings:
Condition is always false et Unreachable code
Arf c'est pas de ma faute alors ?!
 
Faudrait peut etre que je precise que je marche sur un truc viellissant:
Turbo C++ 3 sur un 386 (je suis obligé)
 
Merci de votre patience !


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 07-04-2005 à 22:00:32    

Taz a écrit :

tu peux pas. utilise les opérateur bit à bit : &, |, ^, ~


 
En C avec les structures on pouvait définir le nombre de bits pour chaque champ, il y a encore ça en C++ ? Ça ne résoudrait pas son cas ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-04-2005 à 00:32:36    

ben oui.

Reply

Marsh Posté le 08-04-2005 à 10:04:11    

Citation :

En C avec les structures on pouvait définir le nombre de bits pour chaque champ, il y a encore ça en C++ ? Ça ne résoudrait pas son cas ?


 
Vous pourriez eclairer ma lanterne si y'a une solution ?
 
Merci bcp d'avance !!!


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 08-04-2005 à 10:06:58    

Reply

Marsh Posté le 08-04-2005 à 10:09:25    

oZen a écrit :

cette fois j'ai 2 warnings:
Condition is always false et Unreachable code
Arf c'est pas de ma faute alors ?!
 
Faudrait peut etre que je precise que je marche sur un truc viellissant:
Turbo C++ 3 sur un 386 (je suis obligé)
 
Merci de votre patience !


C'est normal, ta condition 0x41 & 0x80 est toujours fausse. Faut tester avec un truc variable

Reply

Marsh Posté le 08-04-2005 à 10:34:20    

Et pourquoi il faudrait que ce soit des variables ?
J'ai pas le droit de tester deux nombres comme ca ?


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 08-04-2005 à 10:34:48    

Bah ce ne sont que des warnings après, pas des erreurs ;)

Reply

Marsh Posté le 08-04-2005 à 10:43:18    

Oui, mais c'est de ma faute alors si ca marche pas ?
 
PS: Chuis vraiment désolé de faire le "Heavy weight man".


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 08-04-2005 à 12:31:45    

ben reflechie, ton compilateur t'averti juste que tu teste une expression constante, c'est a toi de savoir ce que tu fais

Reply

Marsh Posté le 08-04-2005 à 14:38:50    

En faite si tu fais complier  
if (false)
{
  ...
}
 
Le compilo te dira le meme warning car le bloc ne s'exécutera jamais vu que false ben c'est tout le temps faux :o

Reply

Marsh Posté le 08-04-2005 à 15:23:56    

Oui mais g fait le polio sur ce coup là, comme l'a dit skelter, il fallais que je reflechisse un peu.
 
Mais tout est OK now, j'ai ce que je veux c'est nikel, vous m'avez grave aidé, so, merci beaucoup a tous !!!!


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed