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 |

