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 :
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1L0L0L0L0L1L1L0L1L1L0L1L0L0L0L0L1L1L0L0L0L0L0L0L1L1L0L0L0L0L0L1L1L
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 100001101101000011000000110000011
ce qui affiche :
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
Cordialement.
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
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 :
D'autre part, dans la question "Comment convertir un nombre entier dans une autre base ?", la formulation :Il n'existe pas de fonctions dans la distribution de Python pour convertir un nombre entier en binaire
me paraît peu claire : qu'est-ce que ça veut dire "ou en base 10" ici ?Pour convertir un nombre entier (ou en base 10)
Partager