Isoler les bits d'un octets [Débutant inside] - C++ - Programmation
Marsh Posté le 07-04-2005 à 17:45:58
une variable pour un bit ? mais pourquoi diantre faire ça ?
Marsh Posté le 07-04-2005 à 17:49:36
tu peux pas. utilise les opérateur bit à bit : &, |, ^, ~
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
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
Marsh Posté le 07-04-2005 à 17:54:16
Citation : une variable pour un bit ? mais pourquoi diantre faire ça ? |
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 !!
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 :
|
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 |
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 ?
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 :
|
A la sortie on aura :
unFlag est actif dans 7 puisque
|
unFlag est inactif dans 8 puisque
|
Marsh Posté le 07-04-2005 à 18:35:24
oZen a écrit :
|
pas forcément, si tu veux conserver les bits 3 et 7 d'un octet, tu masques comme ceci :
octet & 0x88 (= 10001000 en binaire)
Marsh Posté le 07-04-2005 à 18:41:45
Mais pour moi c'est parfait un seul bit donc c'est cool !
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é . 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
Marsh Posté le 07-04-2005 à 18:52:41
OK, ben c'est nikel !
Merci pour ce petit cours bien sympa !
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> )
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...
Marsh Posté le 07-04-2005 à 19:56:51
IrmatDen a écrit : |
std::vector<bool> est une specialisation (au niveau du type) de std::vector
http://www.sgi.com/tech/stl/bit_vector.html
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...
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). |
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
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
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 :
|
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...
Marsh Posté le 07-04-2005 à 21:35:34
Et si tu fais :
Code :
|
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 !
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 ?
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 !!!
Marsh Posté le 08-04-2005 à 10:06:58
"bit fields" :
http://www.cs.cf.ac.uk/Dave/C/node13.html
Marsh Posté le 08-04-2005 à 10:09:25
oZen a écrit : cette fois j'ai 2 warnings: |
C'est normal, ta condition 0x41 & 0x80 est toujours fausse. Faut tester avec un truc variable
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 ?
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".
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
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
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 !!!!
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