Outils pour utilisateurs

Outils du site


code_gray

Générateur de code de Gray

Qu'est-ce que le code de Gray?

C'est un code binaire particulier, qui a pour caractéristique principale de passer d'un nombre au nombre suivant en ne changeant qu'un seul bit.

Par exemple, on passe de 3=“00000010” à 4=“00000110”: seul le 3ème bit en partant de la droite est passé de “0” à “1”.

Ce code est très utilisé en automatisme et en informatique (hardware), parce que, dans ces techniques, le changement d'état simultané de plusieurs organes logiques est une source d'instabilité.

Il est aussi utilisé pour résoudre certains casse-tête (comme le baguenaudier par exemple: http://www.recreomath.qc.ca/dict_baguenaudier.htm). D'ailleurs, c'est pour résoudre ce jeu que ce code a été publié pour la première fois par un certain Louis Gros, clerc de notaire à Lyon, en 1872. Mais c'est l'américain Frank Gray qui déposa un brevet sur ce code en 1953.

Pour en connaitre plus: http://fr.wikipedia.org/wiki/Arithm%C3%A9tique_binaire

Voilà un exemple de progression comparée entre le code binaire normal et le code de Gray. Vous pouvez constater qu'on passe d'une ligne à la suivante en ne changeant qu'un seul bit pour le code de Gray, ce qui n'est pas vrai pour le code binaire normal:

dec.  binaire   code Gray
00    00000000  00000000
01    00000001  00000001
02    00000010  00000011
03    00000011  00000010
04    00000100  00000110
05    00000101  00000111
06    00000110  00000101
07    00000111  00000100
08    00001000  00001100
09    00001001  00001101
10    00001010  00001111
11    00001011  00001110
12    00001100  00001010
13    00001101  00001011
14    00001110  00001001
15    00001111  00001000
16    00010000  00011000
17    00010001  00011001
18    00010010  00011011
19    00010011  00011010
20    00010100  00011110

Générateur de code de Gray

Code proposé (script inspiré de la page de wikipedia):

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
# Python v2.7
 
def dec2gray(num):
    """retourne le code gray correspondant au nombre entier 'num' """
    return (num>>1)^num
 
# dec2bin améliore l'affichage binaire des nombres en ajoutant si nécessaire des zéros à gauche
dec2bin = lambda x, n=8: bin(x)[2:].zfill(n)
 
# exemple d'utilisation
print dec2bin(dec2gray(14))  
# affiche: "00001001"
 
print dec2bin(dec2gray(14),16)  
# affiche: "0000000000001001"

En entrée de cette fonction dec2gray, num est le nombre décimal que l'on veut convertir en code de Gray. La fonction dec2gray est valable pour des mots de plus de 8 bits.

Conversion inverse

Pour obtenir le nombre décimal correspondant à un code de Gray donné (script inspiré de la page de wikipedia):

def gray2dec(num):
    """retourne le nombre entier correspondant au code Gray num"""
    shift = 1
    while True:
        idiv = num >> shift
        num ^= idiv
        if idiv <= 1 or shift == 32: 
            return num
        shift <<= 1
 
# exemple d'utilisation
print gray2dec(int("00001001",2))  # affiche: 14

En entrée de cette fonction, num est le nombre entier décimal représentant le code de Gray. Si celui-ci est connu sous forme de chaine binaire (ex: “00001001”), il faut faire une conversion comme: int(“00001001”,2).


Amusez-vous bien!

code_gray.txt · Dernière modification: 2012/03/17 08:19 de tyrtamos

Outils de la page