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

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

Marsh Posté le 22-09-2009 à 11:02:29    

: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) // Eurosataniste convaincu.
Reply

Marsh Posté le 22-09-2009 à 11:02:29   

Reply

Marsh Posté le 22-09-2009 à 13:44:50    

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
Reply

Marsh Posté le 22-09-2009 à 14:57:04    

: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) // Eurosataniste convaincu.
Reply

Marsh Posté le 22-09-2009 à 16:42:23    

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.

Reply

Marsh Posté le 22-09-2009 à 17:19:05    

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

Reply

Marsh Posté le 22-09-2009 à 18:20:50    

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) // Eurosataniste convaincu.
Reply

Marsh Posté le 22-09-2009 à 18:46:28    

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

Reply

Sujets relatifs:

Leave a Replay

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