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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Extraction des bits d'un nombre

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Extraction des bits d'un nombre

n°1925742
newbie_mas​ter
Jack l'éventré
Posté le 22-09-2009 à 11:02:29  profilanswer
 

:hello: à tous.
 
Je suis entrain de décoder des messages envoyés par un récepteur GPS via un socket et j'aimerai récupérer plusieurs infos. Le décodage du buffer en lui même ne pose pas de soucis, sauf sur certains points un peu sioux:
 
J'ai un ensemble de flag qui est transmis dans un Unsigned integer on 4 bytes (32 bits) (Merci la doc) et j'aimerais récupérer certains de ces flags. J'ai lu des choses sur les opérations binaires, mais ca dépasse largement mes capacités. La doc me donne çà :
 

Citation :

Bit field indicating the status of key components of the receiver:  
(...)
bit 7: CPU_OVERLOAD: this bit is set when the CPU load stayed above 80% for at least 10 seconds. It stays set for another 5 minutes after the CPU load has decreased back
below 80%. If this bit is set, the user should decrease the work-load on the CPU by using one of the methods described in section 3.7.
(...)


 
Comment je peut faire pour extraire ce booléen ? :jap:


Message édité par newbie_master le 22-09-2009 à 11:02:44

---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Long Live Rock'n'roll ! // http://www.moto-trip.com
mood
Publicité
Posté le 22-09-2009 à 11:02:29  profilanswer
 

n°1925803
olivthill
Posté le 22-09-2009 à 13:44:50  profilanswer
 

Il y a plusieurs méthodes.
 
Tout d'abord, j'ai un tout petit doute, si le bit 7 est le 7e ou 8e bit, selon qu'il existe un bit 0 ou non. Supposons que c'est le 7e.
 
On pourrait isoler le 7e bit en faisant un décallage de l'entier de 6 pas vers la droite, et en mettant à 0 les autres bits avec un masque : b = (a >> 6) & 1;
 
Ou on peut laisser  le 7e bit à sa place et on fait un masque particulier : b = a & 64; (64 = 2 puissance 6) puis on teste si b est égal à 0 ou pas (en l'occurence à 64).


Message édité par olivthill le 22-09-2009 à 13:45:43
n°1925836
newbie_mas​ter
Jack l'éventré
Posté le 22-09-2009 à 14:57:04  profilanswer
 

:jap: pour ta réponse
 
Pour évacuer ton doute, il s'agit du 8e bit puisqu'il y'a un flag sur le bit 0, mais seuls les flags à partir du bit 7 m'intéresse. Pas grave, l'essentiel est que je comprenne la méthode :)
 
EDIT (tab :fou: )
 
Dans la première méthode, tu fait une permutation circulaire des bits en les décalant vers la droite ( gauche :??: ), et aprés tu fait un ET logique sur le premier bit en utilisant un masque de 32 bits où seul le premier bit est "true"?
 
La deuxième me parle beaucoup plus, tu fait simplement un ET logique avec un masque ou le 6e bit est true?
 
 
 


Message édité par newbie_master le 22-09-2009 à 15:04:26

---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Long Live Rock'n'roll ! // http://www.moto-trip.com
n°1925886
olivthill
Posté le 22-09-2009 à 16:42:23  profilanswer
 

Oui, c'est ça.
Permutation (qui n'est pas circulaire, si je ne me trompe pas, car les bits qui disparaissent à droite ne sont pas rénjectés à gauche) vers la droite (là encore, je ne crois pas me tromper, du moins sur les processeurs pour les PC, mais je n'ai pas fait de test, alors je ne suis sur qu'à 95%), et ET logique avec le nombre 1 qui est 2 puissance 0. Le résultat est 0 (not set) ou 1 (set).
Ou bien un masque avec uniquement le 6e bit set si 64, ou le 7e si 128.

n°1925911
bjone
Insert booze to continue
Posté le 22-09-2009 à 17:19:05  profilanswer
 

fait un enum.
 
enum Flags
{
     CPU_OVERLOAD = 1<<7,
     bidule_truc = ...
};

n°1925933
newbie_mas​ter
Jack l'éventré
Posté le 22-09-2009 à 18:20:50  profilanswer
 

olivthill a écrit :

Oui, c'est ça.
Permutation (qui n'est pas circulaire, si je ne me trompe pas, car les bits qui disparaissent à droite ne sont pas rénjectés à gauche) vers la droite (là encore, je ne crois pas me tromper, du moins sur les processeurs pour les PC, mais je n'ai pas fait de test, alors je ne suis sur qu'à 95%), et ET logique avec le nombre 1 qui est 2 puissance 0. Le résultat est 0 (not set) ou 1 (set).
Ou bien un masque avec uniquement le 6e bit set si 64, ou le 7e si 128.


 
Ok, je commence à comprendre le principe de ce genre d'opération. :jap:
C'est vachement plus simple expliqué comme çà que les différents truc que j'ai trouvé sur le net [:joce]
 
Mettons si j'ai un char qui contient plusieurs données, en combinant les décalages, je dois pouvoir reconstruire sa valeur :)
 
genre sur les 4 premiers:
v = (a&1) * 2^0 + ((a>>1)&1) * 2^1 + ((a>>2)&1) * 2^2 + ...
 
Correct ? :)
 

bjone a écrit :

fait un enum.
 
enum Flags
{
     CPU_OVERLOAD = 1<<7,
     bidule_truc = ...
};


 
J'ai déjà croisé ca dans des docs ou des sourcse, mais comment ca fonctionne ? :??:
( Je suis totalement autodidacte, j'apprends au fur et à mesure de mes besoins :) )


---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Long Live Rock'n'roll ! // http://www.moto-trip.com
n°1925937
bjone
Insert booze to continue
Posté le 22-09-2009 à 18:46:28  profilanswer
 

int Bidule = ....
 
if( Bidule & CPU_OVERLOAD )
     ....;


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

  [C++] Extraction des bits d'un nombre

 

Sujets relatifs
[Réglé][C++]Vérification d'algorithme + conseilsASM(masm32) ou C++ ?
[C] conversioncross compilation C++ et wrapper C++
[RESOLU]Limiter le nombre de résultats d'un fichier xmlProgramation en C
[C#]Cherche idée de programme, sondageEncoder une URL en CSharp C#
[C++] Probleme de Makefile/linkage[Résolut]liaison Ada avec un .o C
Plus de sujets relatifs à : [C++] Extraction des bits d'un nombre


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