Code Gray
En automatique, lorsqu'on procède à un comptage 0 , 1 , 2 , 3 ,4 , ... cela se traduit en binaire naturel
Par exemple sur 4bits par 0000, 0001, 0010, 0011, 0100, ...
Problême : lors du passage de 0001 à 0010 , 2 bits doivent changer d'état.
On pourrait alors avoir 0000, 0001, 0011, 0010 ou 0000, 0001, 0000, 0010. C'est-à-dire 0 , 1, 3, 2 ou 0 , 1, 0, 2
De même pour le passage de 0011 à 0100, etc.
Le codage Gray, appelé encore binaire réfléchi donne une succession de nombres binaires qui ne différent que par 1 bit.
L'algorithme est Ng = ( N ⊕ 2N ) / 2
Voici la traduction simple en PHP :
<?
function gray( $x )
{
if ( ($x == 0) || ($x == 1) ) return $x;
return ( ( $x ^ ( $x << 1) ) >> 1);
}
?>
<TABLE><tr><td>N</td><td>gray</td></tr>
<?
// les 16 premiers nombres
for ( $i = 0; $i < 16; $i++ )
{
$x = sprintf("%04b", gray($i) ); // sur 4 bits, complété par des 0 à gauche
echo "<tr><td>".$i."</td><td>".$x."</td></tr>";
}
?>
</TABLE>
Les résultats
Décimal | Code Gray |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0011 |
3 | 0010 |
4 | 0110 |
5 | 0111 |
6 | 0101 |
7 | 0100 |
8 | 1100 |
9 | 1101 |
10 | 1111 |
11 | 1110 |
12 | 1010 |
13 | 1011 |
14 | 1001 |
15 | 1000 |