Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre du Club
    Inscrit en
    juillet 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 81
    Points : 56
    Points
    56

    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 :
    1L0L0L0L0L1L1L0L1L1L0L1L0L0L0L0L1L1L0L0L0L0L0L0L1L1L0L0L0L0L0L1L1L
    au lieu de

    Code :
    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 :
    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 :
    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é
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 185
    Points : 3 724
    Points
    3 724

    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 :
    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
    Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
    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 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    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 861
    Points : 8 463
    Points
    8 463

    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 :
    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 : 56
    Points
    56

    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 :
    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 :
     t=['000', '001', '010', '011', '100', '101', '110', '111']
    et la conversion t[int(i)] sont un petit moins rapide qu'un dictionnaire
    Code :
       t={'0':'000', '1':'001', '2':'010', '3':'011', '4':'100', '5':'101','6':'110','7':'111'}
    et l'accès t[i].

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •