Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, sources pour Python & Zope
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/08/2009, 03h30   #1
c-candide
Membre du Club
 
Inscription : 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 :

Citation:
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 :

Citation:
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 ?
c-candide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2009, 08h48   #2
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
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
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2009, 09h00   #3
Guigui_
Expert Confirmé Sénior
 
Avatar de Guigui_
 
Homme
Ingénieur développement logiciels
Inscription : août 2002
Messages : 1 861
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
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 455
Points : 8 455
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)
Guigui_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2009, 22h22   #4
c-candide
Membre du Club
 
Inscription : juillet 2006
Messages : 81
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 81
Points : 56
Points : 56
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].
c-candide est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h25.


 
 
 
 
Partenaires

Hébergement Web