p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre du Club
    Inscrit en
    juillet 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 81
    Points : 63
    Points
    63

    Par défaut [FAQ] Comment convertir un nombre entier en binaire ?

    Bonjour,

    La FAQ propose --> ICI <-- deux fonctions bin() et bin_optimise() pour convertir un entier en base 2.

    D'une part, ces deux fonctions ne donnent pas le résultat attendu si le nombre à convertir est grand, par exemple bin(4523655555) (et de même pour l'autre fonction) affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1L0L0L0L0L1L1L0L1L1L0L1L0L0L0L0L1L1L0L0L0L0L0L0L1L1L0L0L0L0L0L1L1L
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    100001101101000011000000110000011
    D'autre part, ces deux fonctions sont, sauf erreur de ma part, bien plus lentes que la fonction utilisant la conversion depuis l'octal ou l'hexa. Voici ces fonctions et les tests (Python 2.5) :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    # -*- coding: Latin-1 -*-
     
    def bin(n):
        """Convertit un nombre en binaire"""
        q = -1
        res = ''
        while q != 0:
            q = n // 2
            r = n % 2
            res = `r` + res
            n = q
        return res
     
    def bin_optimise(n):
        """Convertit un nombre en binaire"""
        if n == 0: return '0'
        res = ''
        while n != 0: n, res = n >> 1, `n & 1` + res
        return res
     
    def toBase2_8(n):
        t=['000', '001', '010', '011', '100', '101', '110', '111']
        z=""
        for i in '%o' %(n):
            z+=t[int(i)]
        i=0
        while(z[i]=='0'):
            i+=1
        return z[i:]
     
    def toBase2_16(n):
        t=['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', \
        '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111' ]
        z=""
        for i in '%x' %(n):
            z+=t[int(i,16)]
        i=0
        while(z[i]=='0'):
            i+=1
        return z[i:]
     
    # Verif coherence des resultats   
    n=45236555
    print bin(n), '\n', bin_optimise(n), '\n', toBase2_8(n), '\n', toBase2_16(n)
    print
     
     
    # Test
    import time
     
    n = 300000
    a = time.clock()
    for i in range(1,n): bin(i)
    b = time.clock()
    for i in range(1,n): bin_optimise(i)
    c = time.clock()
    for i in range(1,n): toBase2_8(i)
    d = time.clock()
    for i in range(1,n): toBase2_16(i)
    e = time.clock()
    print b-a, ',', c-b, ',', d-c, ',', e-d
    ce qui affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    10101100100100000101001011 
    10101100100100000101001011 
    10101100100100000101001011 
    10101100100100000101001011
     
    10.2 , 9.27 , 6.82 , 7.18
    Cordialement.

    EDIT
    Je continue ma lecture de la FAQ et je vois qu'il est signalé à la question "Comment convertir un nombre entier dans une autre base ?" qu'en version 2.6 et postérieures, on dispose d'une fonction bin (builtin ?) pour convertir en base 2. Je pense qu'il faudrait le signaler aussi à la question que j'ai évoquée en début de message où il est dit le contraire :

    Il n'existe pas de fonctions dans la distribution de Python pour convertir un nombre entier en binaire
    D'autre part, dans la question "Comment convertir un nombre entier dans une autre base ?", la formulation :

    Pour convertir un nombre entier (ou en base 10)
    me paraît peu claire : qu'est-ce que ça veut dire "ou en base 10" ici ?

  2. #2
    Expert Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 652
    Points : 4 928
    Points
    4 928
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Pour la conversion en binaire (y compris binaire signé), tu peux aussi voir ici sur mon site:

    http://python.jpvweb.com/mesrecettes...ons_en_binaire

    Par curiosité, en utilisant ton code de test (avec n=3000000), voici ce que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    le bin de la faq:              19.0242441428
    ta fonction optimisée:         14.6055574801
    ma fonction dec2bin:           13.1964580694
    la fonction bin du python 2.6: 1.25522377844
    Tyrtamos
    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

  3. #3
    Expert Confirmé Sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2002
    Messages
    1 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : août 2002
    Messages : 1 860
    Points : 8 105
    Points
    8 105

    Par défaut

    Effectivement, le code n'avait pas été testé avec des nombres grands. Pour contrecarrer cela, il suffit (bien entendu, avec un peu de perte en performance) de rajouter [0] pour être sûr de ne prendre qu'un seul caractère

    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
    def bin(n):
        """Convertit un nombre en binaire"""
        q = -1
        res = ''
        while q != 0:
            q = n // 2
            r = n % 2
            res = `r`[0] + res
            n = q
        return res
     
    def bin_optimise(n):
        """Convertit un nombre en binaire"""
        if n == 0: return '0'
        res = ''
        while n != 0: n, res = n >> 1, `n & 1`[0] + res
        return res
    Effectivement, il existe plusieurs algorithmes pour faire cette conversion. De toute façon, à partir de la 2.6, autant utiliser la fonction bin de la lib standard.
    En revanche, au niveau temps de calcul, je ne tombe pas sur les mêmes ordres de grandeurs que toi (faudra que je regarde de plus près).

    Effectivement, à la question "Comment convertir un nombre entier en binaire ?" de la FAQ, il faudra que je corrige le début (surtout qu'en fait de question, il est fait mention de cette fonction bin)

  4. #4
    Membre du Club
    Inscrit en
    juillet 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 81
    Points : 63
    Points
    63

    Par défaut

    Citation Envoyé par tyrtamos Voir le message
    tu peux aussi voir ici sur mon site:
    Tiens je ne connaissais pas mais je suis juste en phase de post-découverte.


    Citation Envoyé par tyrtamos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    la fonction bin du python 2.6: 1.25522377844
    C'est sûr que l'amélioration est spectaculaire.

    Merci de vos réponses et A+.


    EDIT :
    Je me rends compte qu'une liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     t=['000', '001', '010', '011', '100', '101', '110', '111']
    et la conversion t[int(i)] sont un petit moins rapide qu'un dictionnaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       t={'0':'000', '1':'001', '2':'010', '3':'011', '4':'100', '5':'101','6':'110','7':'111'}
    et l'accès t[i].

Discussions similaires

  1. Comment convertir un nombre négatif en positif ?
    Par ecobarito dans le forum Débutant
    Réponses: 3
    Dernier message: 01/10/2007, 00h09
  2. Comment récupérer un nombre codé en binaire
    Par amamisou dans le forum Delphi
    Réponses: 28
    Dernier message: 25/06/2007, 14h31
  3. [FAQ]Comment convertir une std::string en AnsiString ?
    Par Kaji dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/11/2006, 18h08
  4. Réponses: 5
    Dernier message: 11/08/2006, 10h57
  5. Comment convertir un nombre de jours décimal en date
    Par Soutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/11/2005, 00h57

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