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 deCode: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:100001101101000011000000110000011
ce qui affiche :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
Cordialement.Code:
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 :Citation:
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 ?Citation:
Pour convertir un nombre entier (ou en base 10)