Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Petite question sur les décalages de bits



  1. #1
    flolarajasse

    Petite question sur les décalages de bits


    ------

    Bonjour à tous,

    Question, dont la réponse est peut-être très simple :

    J'ai un mot sur 16 bits : XXXX XXXX XXXX XXXX ; si je veux récupérer les bits en gras dans un mot de 8 bits (unsigned char), faut il que je passe par un masque :

    Code:
    unsigned int mot ;
    unsigned char valeur = (mot & 0xFFC0) >> 6;
    Ou est ce que ça marche si je fais simplement :

    Code:
    unsigned int mot ;
    unsigned char valeur = (mot) >> 6;
    Le problème dans ce cas, est que ce sont seulement les 0 de droite qui sortent qui sont perdus, ou tous les bits de poids faibles sont perdus (0 et 1)?

    Même chose pour un décalage à gauche si je veux garder les bits en gras XXXX XXXX XXXX XXXX ; est ce que cette instruction :

    Code:
    unsigned int mot ;
    unsigned char valeur1 = (mot & 0x003F) << 2;
    équivaut à :

    Code:
    unsigned int mot ;
    unsigned char valeur1 = (mot) << 2;
    C'est pour une optimisation de code, histoire de gagner du temps.

    Merci de vos réponses.

    -----
    Java is the best!

  2. Publicité
  3. #2
    jiherve

    Re : Petite question sur les décalages de bits

    Bonjour,
    les décalages devraient suffire , à vérifier avec ce que le compilo génère et l'usage du char, le code pourrait différer suivant que c'est un registre(il y aura un masque) ou une case mémoire.
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    SofEvans

    Re : Petite question sur les décalages de bits

    Citation Envoyé par flolarajasse Voir le message
    J'ai un mot sur 16 bits : XXXX XXXX XXXX XXXX ; si je veux récupérer les bits en gras dans un mot de 8 bits (unsigned char), faut il que je passe par un masque :

    Code:
    unsigned int mot ;
    unsigned char valeur = (mot & 0xFFC0) >> 6;
    Ou est ce que ça marche si je fais simplement :

    Code:
    unsigned int mot ;
    unsigned char valeur = (mot) >> 6;
    Le problème dans ce cas, est que ce sont seulement les 0 de droite qui sortent qui sont perdus, ou tous les bits de poids faibles sont perdus (0 et 1)?
    En partant du fait que c'est du C.

    Quand tu fais fait >>, les bit de poids faible (a droite) sont perdu et les bit de poids fort (à gauche) qui sont inséré sont à 0.
    De plus, si tu ne veux récupérer que ce qui est en gras, le masque à utilisé n'est pas 0xFFC0, mais 0x3FC0 suivi d'un décalage de 6 >> effectivement.
    Sinon tu peux faire un décalage de 6 >> d'abord et ensuite appliquer le masque 0x00FF, ca revient au même.

    Code:
    unsigned int mot ;
    unsigned char methode1 = (mot & 0x3FC0) >> 6;
    unsigned char methode2 = (mot >> 6) & 0x00FF;


    Citation Envoyé par flolarajasse Voir le message
    Même chose pour un décalage à gauche si je veux garder les bits en gras XXXX XXXX XXXX XXXX ; est ce que cette instruction :

    Code:
    unsigned int mot ;
    unsigned char valeur1 = (mot & 0x003F) << 2;
    équivaut à :

    Code:
    unsigned int mot ;
    unsigned char valeur1 = (mot) << 2;
    C'est pour une optimisation de code, histoire de gagner du temps.

    Merci de vos réponses.
    Tes deux écriture ne sont pas identique. Dans la première, tu applique le masque pour ne garder que les 6 bit de poids faible et ensuite tu multiplie ton résultat par quatre, dans la deuxième tu multiplie ta valeur par 4 directement.
    Si tu ne veux garder que les bit en gras, applique simplement le masque 0x003F.

    A savoir que faire ">> x" revient a diviser par 2 puissance x et que faire "<< x" revient a multiplier par 2 puissance x.

    Code:
    unsigned int mot = 8;
    unsigned char valeur1;
    
    valeur1 = mot << 2; /* valeur1 = 32 */
    valeur1 = mot >> 2; /* valeur1 = 2 */

  5. #4
    Jack

    Re : Petite question sur les décalages de bits

    finalement, pour récupérer les 8 bits en gras, on peut se passer de masque:

    Code:
    mot = (mot << 2) >> 8;

  6. #5
    SofEvans

    Re : Petite question sur les décalages de bits

    A condition que la variable soit bien sur 4 octet.
    Je connais mal la programmation C sur des micro-contrôleur, mais sur des ordinateur, on à l'habitude de ne jamais présumé du nombre d'octet que prends un type de variable (sauf char, bien entendu, c'est écrit dans la norme).

    Après, j'imagine que si la doc du PIC précise 4 octet, alors il n'y a pas à douter.
    Je ne sais cependant pas si un décalage est plus rapide qu'un masque.

  7. A voir en vidéo sur Futura
  8. #6
    jiherve

    Re : Petite question sur les décalages de bits

    Bonsoir,
    en fait ce qu'il veut éviter c'est décalage et masque.
    Un masque c'est presque toujours un cycle machine
    un décalage ben cela dépend de la présence ou non d'un barrel shifter, avec ce dernier un cycle machine sans ce dernier autant de cycles que de décalage à effectuer,bien sur ce n'est pas visible depuis le C .
    JR
    l'électronique c'est pas du vaudou!

  9. Publicité
  10. #7
    SofEvans

    Re : Petite question sur les décalages de bits

    Éviter les décalage et les masque ??

    Je ne vois pas comment faire, hormis forcer la lecture depuis un autre emplacement mémoire, et encore, cela se ferait sous des conditions très restrictive :
    * On ne peut lire que depuis le début d'un octet, pas moyen de lire a partir du bit 1 à 7.
    * On ne peut lire qu'octet par octet.

    Par exemple, si on veut lire xxxx xxxx xxxx xxxx XXXX XXXX xxxx xxxx

    #include <stdlib.h>
    #include <stdio.h>

    int main(void)
    {
    int val; /* sur 4 octet */
    char *depart;

    val = 4864; /* Donc 0000 0000 0000 0000 0001 0011 0000 0000 */
    depart = ((char*)&val + 1);

    printf ("%d\n", *depart); /* Affiche 19, ce qui correspond à 0001 0011 */

    return EXIT_SUCCESS;
    }
    Sinon franchement, je ne vois absolument pas comment faire plus rapide que des opérations de bit.
    Si le décalage est a éviter au max, alors on fait toujours un masque.
    Si le décalage est inévitable, on ne décale qu'a gauche après un masque.

    C'est là tout ce que je sais. Il y a peut être une solution plus rapide, mais ce n'est pas moi qui pourrait le dire.
    Bon courage.

  11. #8
    jiherve

    Re : Petite question sur les décalages de bits

    Re
    le "et" est à comprendre au sens strict, ici le décalage étant indispensable il ne veut pas avoir à faire un masque en plus.
    En assembleur c'est tellement plus évident!
    JR
    l'électronique c'est pas du vaudou!

  12. #9
    PA5CAL

    Re : Petite question sur les décalages de bits

    Bonsoir

    Pour XXXX XXXX XXXX XXXX, faire :
    Code:
    unsigned int mot;
    unsigned char valeur = (mot >> 6)&0x3F;
    Pour XXXX XXXX XXXX XXXX, faire :
    Code:
    unsigned int mot;
    unsigned char valeur1 = mot & 0x3F;
    Ici, aucun décalage n'est nécessaire car les bits sont déjà à leur place.

    Dans les deux cas, le ET sert à mettre à 0 les deux bits de poids fort du résultat.
    Dernière modification par PA5CAL ; 04/12/2014 à 21h26.

  13. #10
    PA5CAL

    Re : Petite question sur les décalages de bits

    Oups... j'avais mal lu, il faut décaler de 2 bits à gauche dans le deuxième cas.

    La question est donc de faire disparaître les bits de gauche. Il n'y a rien à faire, car la conversion en unsigned char s'en charge :
    Code:
    unsigned int mot;
    unsigned char valeur1 = mot << 2;
    Un ET logique avant ou après le décalage est par conséquent superflu.

    Sur un processeur 8 bits, pour optimiser on peut faire :
    Code:
    unsigned int mot;
    unsigned char valeur1 = ( (unsigned char)mot ) << 2;
    Le décalage ne sera alors réalisé que sur un octet.
    Dernière modification par PA5CAL ; 04/12/2014 à 21h34.

  14. #11
    RISC

    Re : Petite question sur les décalages de bits

    Salut,

    Le nombre de cycles nécessaire à un décalage dépend surtout du jeu d’instructions assembleur du PIC utilisé.

    Par exemple pour les PIC 8 bits (PIC10/12/16/18) chaque décalage de 1 bit nécessite une instruction. Pour les PIC 16 bits (PIC24, dsPIC33) il est possible de décaler de n bits en 1 instruction car ils possèdent un barrel shifter.

    Le plus simple c’est de faire différents essais, en écrivant du C et en regardant le code assembleur généré (Window > Output > disassembly listing dans MPLAB X)

    a+
    Ma marotte ? les microcontrôleurs ;=)

Sur le même thème :

Discussions similaires

  1. consommation PIC pour registres à décalages
    Par boy30 dans le forum Électronique
    Réponses: 9
    Dernier message: 20/02/2013, 15h12
  2. Posez votre question Signaler [exo telecom]capacité maximale (en bits/sec)
    Par ohayo91 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 26/02/2012, 21h53
  3. Programme 32 bits sur Windows 7 Home premium edition 64 bits
    Par AgatheJ dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 10/02/2012, 19h08
  4. Réponses: 0
    Dernier message: 08/02/2012, 17h03
  5. Convertir 12 bits série en 7 bits paralléle avec un HC11 ?
    Par djsat dans le forum Électronique
    Réponses: 2
    Dernier message: 03/03/2005, 09h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.