@Artemus24
Il n'y a pas plus simple que ce qui a été indiqué , à savoir :
- L'encodage d'un nombre binaire en gray , c'est la comparaison de 2 bits consécutifs (en partant de la droite vers la gauche) , ils doivent être différent pour avoir comme résultat 1 et 0 si identique .
Cela se simplifie par un masque de ce nombre , décalé d'un rang vers la droite .
Code : Tout sélectionner
def bin2gray (n):
masq = n >> 1 # le masque , soit n décalé d'un rang à droite
gray = n ^ masq # comparaison des bits consécutifs
print ("%2i 0b%04i <=> %2i 0b%04i" %(n, int(bin(n)[2:]), gray, int(bin(gray)[2:])))
return
Code : Tout sélectionner
>>> for n in range (16):
... bin2gray(n)
...
0 0b0000 <=> 0 0b0000
1 0b0001 <=> 1 0b0001
2 0b0010 <=> 3 0b0011
3 0b0011 <=> 2 0b0010
4 0b0100 <=> 6 0b0110
5 0b0101 <=> 7 0b0111
6 0b0110 <=> 5 0b0101
7 0b0111 <=> 4 0b0100
8 0b1000 <=> 12 0b1100
9 0b1001 <=> 13 0b1101
10 0b1010 <=> 15 0b1111
11 0b1011 <=> 14 0b1110
12 0b1100 <=> 10 0b1010
13 0b1101 <=> 11 0b1011
14 0b1110 <=> 9 0b1001
15 0b1111 <=> 8 0b1000
>>>
- Le décodage d'un nombre gray en binaire , c'est la somme des bits (en partant de la gauche vers la droite) , si la parité de la somme est paire le résultat est 0 et 1 si impaire .
Cela se simplifie par un masque (aussi) de ce nombre , mais qui se décale à chaque fois vers la droite pour supprimer un bit .
Code : Tout sélectionner
def gray2bin (n):
binaire = 0
masq = n # le masque
while masq:
binaire = binaire ^ masq # application du masque , à chaque fois qu'un bit du masque est supprimé la parité restante change .
masq >>= 1 # décalage du masque à droite , un bit est ainsi supprimé .
print ("%2i 0b%04i <=> %2i 0b%04i" %(n, int(bin(n)[2:]), binaire, int(bin(binaire)[2:])))
return
Code : Tout sélectionner
>>> gray
[0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8]
>>> for n in gray:
... gray2bin(n)
...
0 0b0000 <=> 0 0b0000
1 0b0001 <=> 1 0b0001
3 0b0011 <=> 2 0b0010
2 0b0010 <=> 3 0b0011
6 0b0110 <=> 4 0b0100
7 0b0111 <=> 5 0b0101
5 0b0101 <=> 6 0b0110
4 0b0100 <=> 7 0b0111
12 0b1100 <=> 8 0b1000
13 0b1101 <=> 9 0b1001
15 0b1111 <=> 10 0b1010
14 0b1110 <=> 11 0b1011
10 0b1010 <=> 12 0b1100
11 0b1011 <=> 13 0b1101
9 0b1001 <=> 14 0b1110
8 0b1000 <=> 15 0b1111
>>>
Code : Tout sélectionner
def gray2bin (n):
l = list(bin(n)[2:]) # converti le nombre en suite de bits dans une liste
binaire = 0
parity = 0
for bit in l: # lecture de la liste
if int(bit):
parity ^= 1 # change la parité à chaque bit 1
binaire <<= 1
binaire += parity
print ("%2i 0b%04i <=> %2i 0b%04i" %(n, int(bin(n)[2:]), binaire, int(bin(binaire)[2:])))
return