IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

rotation de bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Par défaut rotation de bits
    Bonjour a tous,
    Est ce que quelqu'un sais si il est possible de faire une rotation de bits sur une valeur quelconque, en C.
    Attention, je parle pas du decalage classique avec les operateurs << et >>, mais une rotation, cad qu'en plus de decaler, il faut reinjecter les bits sortant de l'autre cote, exemple:

    0x0001 si rotation a droite, devient: 0x8000

    Une instruction assembleur (le ROR/ROL) nous permet de faire ca, mais j'arrive pas a l'utiliser!! (voir forum assembleur)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Citation Envoyé par pierabobl
    0x0001 si rotation a droite, devient: 0x8000
    Quand tu fais une rotation je ne vois pas comment tu peux faire pour passer de 0x0001 à 0x8000.

    ce serais plus logique que 0x0001 devienne 0xF000.

    La représentation la plus simple pour les rotations reste le binaire:

    tu veux passer de :

    00 00 01 01 à 10 00 00 10

    le ROR et le ROL doivent avoir une correspondance en C j'investigue ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Je pense que pour la rotation vers la gauche tu devra te servir des décalages simple avec les retenues.

    retenues ou overflow comme tu préfère (mais je ne me souviens plus trop du fopnctionnement de l'overflow et de sa mise en pratique )

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Il faut bien faire attention aux mots que tu utilise . Dans ton intitulé tu parle de rotation de bits et dans ton exemple il est question d'hexadecimal....

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Par défaut rotation de bits
    Ok, je vais essayer d'etre plus clair.

    en binaire, la rotation droite d'un octet 0000 0001 donnerait:
    1000 0000

    en pratique j'aurais plutot besoin d'un mot de plusieurs octet c'est pour ca que je l'ai mit en hexa

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    A ce moment la si tu veux faire des rotation sur des octets utilise des word et fais comme indiqué ci dessus.

    C'est à dire tu as un octet genre en Hexa 0xA5

    Donc 0xA5 ca donne en binaire 1010 0101

    Tu veux faire une rotation vers la gauche.
    tu mets ton octet dans un word (initialisé à zero).

    Ca donne 0000 0000 1010 0101.

    Tu fais des décalages simples à gauche et si tu as quelque chose de la forme :

    0000 0001 0100 1010 tu ajoute un cela te donne une rotation vers la gauche.

    tu peux utiliser ce procédé pour les rotations à droite en mettant ton octet dans le poids fort d'un word

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par fveysseire
    Quand tu fais une rotation je ne vois pas comment tu peux faire pour passer de 0x0001 à 0x8000.

    ce serais plus logique que 0x0001 devienne 0xF000.
    Et par quel miracle ?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fveysseire
    Quand tu fais une rotation je ne vois pas comment tu peux faire pour passer de 0x0001 à 0x8000.
    ben si...
    ce serais plus logique que 0x0001 devienne 0xF000.
    ben non...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    ben si...

    ben non...
    Autant pour moi on passe bien de 0x0001 à 0x8000 en faisant une rotation à droite.

    Désolé pour mon erreur.

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par pierabobl
    Est ce que quelqu'un sais si il est possible de faire une rotation de bits sur une valeur quelconque, en C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    unsigned rotate_right(unsigned x, int count)
    {
        // assume unsigned has no padding bits
        int const unsigned_bit_count = CHAR_BIT * sizeof unsigned;
        count %= unsigned_bit_count;
        if (count < 0)
            count += unsigned_bit_count;
        // but don't assume anything about << unsigned_bit_count
        if (count == 0)
            return x;
        else
            return (x >> count) | (x << unsigned_bit_count-count);
    }

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pierabobl
    Est ce que quelqu'un sais si il est possible de faire une rotation de bits sur une valeur quelconque, en C.
    Oui, mais pas directement. Il faut sauvegarder le bit qui va être ejecté faire le décalage et le réintroduire à la main...

    OK, c'est pas terrible, mais en version portable, y'a pas mieux (peut être qu'un compilateur très malin detecterait la manoeuvre et mettra un ROL ou ROR...).

    Evidemment, tu peux mettre de l'assembleur en ligne, mais je n'ai rien dit...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Binaire] Opérateurs de rotation dee bits ?
    Par Tifauv' dans le forum C
    Réponses: 3
    Dernier message: 09/11/2017, 11h29
  2. Rotation de bits avec Delphi.
    Par fred61 dans le forum Débuter
    Réponses: 7
    Dernier message: 25/05/2011, 12h57
  3. Comment faire une rotation des bits vers la droite ?
    Par Jean-Marc.Bourguet dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h12
  4. Rotation de bits d'un char.
    Par fred61 dans le forum Débuter
    Réponses: 5
    Dernier message: 07/08/2009, 15h17
  5. [Free Pascal] Rotation de bits
    Par bubulemaster dans le forum Free Pascal
    Réponses: 2
    Dernier message: 26/12/2007, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo