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

Python Discussion :

rotation par la droite


Sujet :

Python

  1. #1
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut rotation par la droite
    Bonjour,

    j'ai besoin de faire une rotation par la droite sur un groupe de bits. J'ai codé une fonction pour le faire, mais j'aimerai savoir si il y a pas plus simple. Il me semble que je dois faire beaucoup de conversions (transformation en string puis retour en binaire).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    def rotate_right(value, rotate, lenght):
        # basic case
        if (rotate == 0):
            return value
     
        # convert value in binary
        binary_value = bin(value)
        binary_value = binary_value[2:] # cut the 0b
        len_binary = len(binary_value)
     
        # error, we want a size inferior than 
        if (len_binary > lenght):
            raise("Size of new value smaller than original value")
            return None
     
        # padding with 0 and concat the value
        list = []
        for i in range(lenght-len_binary):
            list.append("0")
        list.append(binary_value)
     
        binary_value = ''.join(list)
     
        # rotate
        binary_value = binary_value[lenght-rotate:] + binary_value[:lenght-rotate]
     
        return int(binary_value,2)
    Je suis aussi preneur pour toutes optimisations, ou amélioration du code (bonnes pratiques...)

    Merci de votre aide

    p.s. je travaille en python 2.7

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Pourquoi ne pas utiliser << et >> ?
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> x = 8
    >>> y = x << 2
    >>> y
    32
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    << et >> font du décalage, pas une rotation

    Le problème est fun à gérer en binaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    def rr(val, r, l):
        # r = longueur de la rotation
        # l = longueur de la chaine binaire de sortie
        #on crée un masque de longueur r bits
        mask = (2**r)-1
        #qui permet de récupérer les r derniers bits
        cpl = val&mask
        #on décale ces bits de l-r bits vers la gauche
        dpl = cpl<<(l-r)
        #on décale la valeur d'entrée de r bits vers la droite
        res_tmp = (val>>r)
        #et on recolle les bits décalés sur la gauche
        res = res_tmp | dpl
        return res
    Pourfendeur de singletons en croisade

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    << et >> font du décalage, pas une rotation
    Certes!
    Mais est ce que l'auteur passe par les chaînes de caractères par ignorance ou parce que c'est une contrainte d'exercice d'étudiant?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà comment on peut faire les rotations de bits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # rotation à droite  de 1 bit d'un mot de nb bits
    rotd = lambda b, nb: (b>>1) | ((b&1)<<(nb-1))
     
    # rotation à gauche  de 1 bit d'un mot de nb bits
    rotg = lambda b, nb: ((b<<1)&(2**nb-1)) | ((b>>(nb-1))&1)
    Pour afficher complètement un mot de nb bits dans le format binaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strbin = lambda x , nb: str(bin(x))[2:].zfill(nb)
    Exemple d'utilisation sur un octet (nb=8)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    x = 111  # 0b1101111
    print strbin(x,8)
    01101111
     
    # 8 rotations à droite
    for i in xrange(0,8):
        x = rotd(x,8)
        print strbin(x,8)
    10110111
    11011011
    11101101
    11110110
    01111011
    10111101
    11011110
    01101111
     
    # 8 rotations à gauche
    for i in xrange(0,8):
        x = rotg(x,8)
        print strbin(x,8)
    11011110
    10111101
    01111011
    11110110
    11101101
    11011011
    10110111
    01101111
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Merci à tous pour votre aide, j'ai implémenter la solution de petitbidon.

    Sinon j'avais utilisé un passage par des strings bêtement pour gérer la taille minimum... dur fin de journée

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

Discussions similaires

  1. Comment valider un items de Treeview par clic droit?
    Par Mickey.jet dans le forum Delphi
    Réponses: 8
    Dernier message: 10/05/2007, 17h23
  2. ouverture de fenetre par clic droit
    Par pierrot2908 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 24/04/2007, 09h34
  3. rotation par rapport à un point
    Par marcololo dans le forum DirectX
    Réponses: 8
    Dernier message: 03/06/2005, 15h36
  4. Comptage de voxels traversés par une droite 3D
    Par mathieu_t dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 27/04/2005, 16h33
  5. selection par click droit
    Par mecocha dans le forum MFC
    Réponses: 2
    Dernier message: 22/12/2004, 22h35

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