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 :

Python, changement de bits sur un entier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut Python, changement de bits sur un entier
    Bonjour,

    Je cherche à faire une manip' assez simple en Python mais malgré quelques recherches, je ne trouve pas comment faire.

    J'ai un entier a et un entier b, ayant une valeur entre 0 et 255. Sous forme binaire, ils sont donc sur 8 bits.
    Je cherche à remplancer les 4 derniers bits (de poids faible) de a par les 4 premiers bits (de poids fort) de b.

    Exemple : Si a=10111100 et b=00011010 alors je veux un entier c ayant pour valeur : c=10110001

    J'ai vu qu'il faut utiliser l'opérateur de décalage <<, mais je n'arrive pas à l'apppliquer dans ce cas là.

    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    La représentation du binaire donne une string, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> a, b = 188, 26  # "10111100", "00011010"
    >>> c = "{:08b}".format(a)[:4] + "{:08b}".format(b)[:4]
    >>> c
    '10110001'
    >>> int(c, 2)
    177

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Super merci beaucoup ! C'est exactement ce qu'il me fallait, quelque chose de simple, rapide et fonctionnel !

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Les opérations binaires ne se font qu'entre entiers. Il faudra donc convertir la représentation '0b10111100' (type str) en entiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = int('0b10111100', 2) # => 188
    b = int('0b00011010', 2) # => 26
    On peut se donner une petite fonction pour afficher correctement avec 8 bits n'importe quel octet connu par sa valeur int:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    forbin = lambda x: '0b' + bin(x)[2:].zfill(8)
    Ensuite:

    Effacement des 4 derniers bits de a et résultat (on utilise le '&' qui est un 'et' binaire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c = a & int('0b11110000', 2)
    print(c, forbin(c)) # => 176 '0b10110000'
    Et ajout des 4 premiers bits de b, glissés de 4 positions à droite (ne pas oublier les parenthèses):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c = c + (b>>4)
    print(c, forbin(c)) # => 177 '0b10110001'
    Edit: grillé...

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

Discussions similaires

  1. Addition d'entier signé sur 64 bits sur un proc 32 bits
    Par SoJaS dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 10/08/2010, 07h22
  2. Réponses: 4
    Dernier message: 08/01/2008, 17h42
  3. Manipulation d'un bit sur un entier
    Par SybVicious dans le forum Débuter
    Réponses: 20
    Dernier message: 30/07/2007, 23h31
  4. [DB2] LIKE sur des entiers
    Par heloise dans le forum DB2
    Réponses: 1
    Dernier message: 07/10/2004, 23h30
  5. []Changement d'échelle sur un MSChart
    Par Lanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2004, 09h08

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