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 :

Représentation binaire de nombres


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut Représentation binaire de nombres
    cela va peut être vous paraitre bete, mais je suis un peu perdu sur cette question.
    Quelle librairie dois je utiliser pour transformer des décimales en hexa ou binaires, et vice versa.....

    merci d'avance.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Décimaux en hexa, il y a la fonction hex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> hex(12)
    '0xc'
    >>> hex(5000)
    '0x1388'
    Dans l'autre sens il y a int(x, base)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> int("1388", 16)
    5000
    >>> int("10001", 2)
    17
    Pur convertir en binaire à mon avis le plus simple est de faire ta propre fonction

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    pour convertir un nombre Décimal en binaire voici la fonction:

    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
     
    def conv_d2b(number):
     
        assert isinstance(number,str)
     
        nbase10 = int(number)
        newbase = []
        i=int(7)                         #nombre de bit-1
     
        while i >= 0:
            j = 0
            while ((j+1) * 2 ** i  <= nbase10) and (j < 1):
                j += 1
            nbase10 = nbase10 - j * (2 ** i)
            newbase.append(str(j))
            i -= 1
     
        return "".join(newbase)
     
     
    # test
    # x='255'
    # print conv_d2b(x)

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Compliqué comme code ça... En plus apparemment tu ne gères que les binaires 8 bits...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def dec2bin(n):
        q, r = -1, -1
        res = ""
        while q != 0:
            q, r = divmod(n, 2)
            res = `r` + res
            n = q
        return res

  5. #5
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    Merci pour ces infos.

    par exemple je peux vous demander de commenter votre code! j'aime bien comprendre ce que j'utilise, et pourquoi.

    En plus, c'est aussi utile pour les autres débutants comme moi.

    merci en tout cas.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Pour ma part c'est la méthode habituelle par divisions successives par 2:
    Tant que le quotient n'est pas nul, on effectue une division euclidienne par 2 (divmod revoie le tuple (quotient, reste)) et on ajoute le reste à gauche du nombre binaire

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par oiffrig
    Compliqué comme code ça... En plus apparemment tu ne gères que les binaires 8 bits...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def dec2bin(n):
        q, r = -1, -1
        res = ""
        while q != 0:
            q, r = divmod(n, 2)
            res = `r` + res
            n = q
        return res
    Je ne suis pas certain que cela gère correctement les nombres négatifs...

    Ceci, je pense, devrait fonctionner :
    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
    import math
     
    def int2bin(x):
        s = ''
        if x < 0:
            prefix = 3
        else:
            prefix = 2
        nbbits_x = (len(hex(x)) - prefix) * 4
        nbbits = pow(2, int(math.ceil(math.sqrt(nbbits_x))))
        if nbbits < 8:
            nbbits = 8
        for k in range(0, nbbits):
            s = str((x & 1 << k) >> k) + s
        return s
    Le nombre de bits renvoyés est toujours une puissance de 2 supérieure ou égale à 8. Sachant que la représentation interne des entiers n'est pas déterminée (il n'y a pas de taille maximale pour les entiers en Python), je me suis basé sur une petite astuce pour trouver le nombre de bits d'affichage, en déterminant d'abord le nombre de digits en hexadécimal (en retirant le préfixe '0x' ou '-0x'), puis en prenant la puissance de 2 dont l'exposant est l'entier immédiatement supérieur à la racine carré du nombre de bits en interne. Le reste est un simple décalage de bit/masquage.

    S'il existe une méthode universelle plus simple, ça m'intéresse de la connaître.

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    A la demande générale (!), une version condensée de la même fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import math
     
    def int2bin_(x):
        return ''.join([str((x & 1 << k) >> k) for k in \
                        xrange(max((8,pow(2,int(math.ceil(math.sqrt((len(hex(x))-2-int(0 > x))*4))))))-1,-1,-1)])
    Je suis bien d'accord sur le fait que c'est à peine lisible, mais c'était pour illustrer une fois de plus le niveau de concision auquel peut prétendre Python. Attention, cette fonction ne fonctionnera correctement qu'à partir de Python 2.4, puisque la fonction hex() ne renvoie pas une chaîne de même longueur pour les nombres négatifs dans les versions précédentes de Python.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Effectivement, c'est plus concis que que ma fonction.
    on reconnait ici la patte du 'big chief"
    Je la garde sous le coude

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

Discussions similaires

  1. Convertion binaire et nombre de bits
    Par bm dans le forum Général Python
    Réponses: 5
    Dernier message: 26/04/2015, 19h02
  2. conversion d'un nombre en binaire en nombre réel
    Par etudiante-m dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/03/2012, 13h23
  3. Comparaison binaire entre nombre trés trés grands.
    Par asouquieres dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2010, 22h31
  4. [Binaire]Affichage nombres
    Par etan01 dans le forum Général Java
    Réponses: 8
    Dernier message: 21/12/2005, 18h48
  5. [VB6] Converssion de nombre en binaire
    Par bencheikh dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/02/2003, 11h13

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