Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1531 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1039193
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 17:41:45  profilanswer
 

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
mood
Publicité
Posté le 07-04-2005 à 17:41:45  profilanswer
 

n°1039200
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-04-2005 à 17:45:58  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1039201
Taz
bisounours-codeur
Posté le 07-04-2005 à 17:49:36  profilanswer
 

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

n°1039202
dreamkille​r
Posté le 07-04-2005 à 17:49:46  profilanswer
 

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
n°1039208
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-04-2005 à 17:53:38  profilanswer
 

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)
n°1039211
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 17:54:16  profilanswer
 

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
n°1039212
IrmatDen
Posté le 07-04-2005 à 17:55:27  profilanswer
 

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


n°1039242
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 18:33:19  profilanswer
 

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
n°1039245
IrmatDen
Posté le 07-04-2005 à 18:34:56  profilanswer
 

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
n°1039246
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-04-2005 à 18:35:24  profilanswer
 

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)
mood
Publicité
Posté le 07-04-2005 à 18:35:24  profilanswer
 

n°1039249
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 18:41:45  profilanswer
 

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


---------------
http://reopen911.online.fr/?page_id=45
n°1039252
IrmatDen
Posté le 07-04-2005 à 18:48:09  profilanswer
 

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

n°1039258
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 18:52:41  profilanswer
 

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


---------------
http://reopen911.online.fr/?page_id=45
n°1039288
skelter
Posté le 07-04-2005 à 19:43:53  profilanswer
 

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

n°1039302
IrmatDen
Posté le 07-04-2005 à 19:54:22  profilanswer
 

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

n°1039307
skelter
Posté le 07-04-2005 à 19:56:51  profilanswer
 

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

n°1039320
IrmatDen
Posté le 07-04-2005 à 20:05:33  profilanswer
 

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
n°1039328
skelter
Posté le 07-04-2005 à 20:15:22  profilanswer
 

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

n°1039333
IrmatDen
Posté le 07-04-2005 à 20:19:46  profilanswer
 

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

n°1039405
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 21:32:55  profilanswer
 

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
n°1039406
IrmatDen
Posté le 07-04-2005 à 21:35:34  profilanswer
 

Et si tu fais :

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

n°1039416
oZen
Récupéré mon Zeuuuu.
Posté le 07-04-2005 à 21:49:18  profilanswer
 

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
n°1039426
antp
Super Administrateur
Champion des excuses bidons
Posté le 07-04-2005 à 22:00:32  profilanswer
 

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
n°1039577
Taz
bisounours-codeur
Posté le 08-04-2005 à 00:32:36  profilanswer
 

ben oui.

n°1039731
oZen
Récupéré mon Zeuuuu.
Posté le 08-04-2005 à 10:04:11  profilanswer
 

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
n°1039737
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-04-2005 à 10:06:58  profilanswer
 
n°1039741
FlorentG
Unité de Masse
Posté le 08-04-2005 à 10:09:25  profilanswer
 

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

n°1039768
oZen
Récupéré mon Zeuuuu.
Posté le 08-04-2005 à 10:34:20  profilanswer
 

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
n°1039769
FlorentG
Unité de Masse
Posté le 08-04-2005 à 10:34:48  profilanswer
 

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

n°1039781
oZen
Récupéré mon Zeuuuu.
Posté le 08-04-2005 à 10:43:18  profilanswer
 

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
n°1039904
skelter
Posté le 08-04-2005 à 12:31:45  profilanswer
 

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

n°1040125
LordHarryP​otter
Posté le 08-04-2005 à 14:38:50  profilanswer
 

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

n°1040249
oZen
Récupéré mon Zeuuuu.
Posté le 08-04-2005 à 15:23:56  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
SQL | Requete de débutant, mais je bug !!!debutant: quel ide et version je jdk choisir?
(débutant) enregistrer des données via un formulairemode reel sur 16 bit / mode protégé sur 32 bits ?
[debutant] aide solution de requetesCopier noeud (debutant)
[Debutant][Applet][Swing]canvas+superposition imagePhp débutant
trie tableau vector... (very debutant) help me please[JBuilder] Execution d'un programme (noob inside)
Plus de sujets relatifs à : Isoler les bits d'un octets [Débutant inside]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR