Fantomas’side

Weblog open-source

Valeur binaire et décalage

L'informatique a un secret, un secret aussi fondamental que spectaculaire. Toutes les informations circulant à l'intérieur d'une calculatrice ou même d'un ordinateur sont composées de 0 et de 1. Ce système appelé binaire, permet de synthétiser toutes les informations possibles, chiffres, images, caractères, à travers des séquences de bits pour rendre ces informations compréhensibles par une machine.

Par exemple, si on prend le nombre 42, il aura besoin de 6 bits pour stocker son information, qui se représentera pour un l'ordinateur 101010. Je vous épargne la conversion du système décimal au système binaire :)

Lors de l'écriture d'une programme, un développeur ne se souciera pas de ces suites de 0 et de 1, c'est le travail du compilateur ou de l'interpréteur, et surtout de la machine. Le développeur se souciera juste du déroulement des différentes actions composant son programme.

Mais parfois il est astucieux d’accéder aux bits d'une valeur stockée en mémoire. Dans l'infographie par exemple, pour les composantes RGB des couleurs, généralement codées sur 32bits (4 octets).

Dans mon cas, j'ai eu besoin de représenter en ActionScript pour Flash les suites de bits contenus dans des nombres indiquant l'heure actuelle. L'avantage de cet algorithme est qu'il est portable et facile à paramétrer.

function arrayOctetBinaryValue(value:Number) : Array {
    var binary = new Array();
    for (var i = 0; i < 8; i++) {
        binary[i] = value & 0x1;
        value = value >> 1;
    }
    return(binary.reverse());
}

arrayOctetBinaryValue(12); // [0, 0, 0, 0, 1, 1, 0, 0]
arrayOctetBinaryValue(183); // [1, 0, 1, 1, 0, 1, 1, 1]

L'avantage de ce genre d'algorithme est qu'il permet avec un peu de configuration la sélection de différentes parties composant une valeur en mémoire. Reprenons le cas de l'infographie, nous avons une couleur RGB, d'un bleu très joli : 0x3366FF.

La valeur 0x3366FF représente sur une base de 10 : 3368703. Mais l'astuce dans le système RGB c'est que chaque octet pour cette couleur stocke la valeur de la couleur rouge, bleu et vert. Une valeur comprise à chaque fois entre 0 et 255, car un octet ne peut stocker qu'une valeur comprise entre ces 2 limites.

Imaginons que nous voulons récupérer la valeur de chacune des composantes de la couleur, rien de plus facile en modifiant un peu l'algorithme précédent, où cette fois ci nous allons traiter la couleur comme une suite de 3 octets.

function arrayColorOctetValue(value:Number) : Array {
    var octet = new Array();
    for (var i = 0; i < 3; i++) {
        octet[i] = value & 0xFF;
        value = value >> 8;
    }
    return(octet.reverse());
}

arrayColorOctetValue(0x3366FF); // [51, 102, 255]

Mais comment s'opère la magie ? L'idée est de considérer les bits constituant la variable comme des groupes de tailles fixes et régulières, et en leur appliquant un masque avec la valeur maximale correspondant à la taille du groupe, on peut récupérer la valeur du groupe, et ainsi passer au groupe de bits suivant.

L'opérateur >> de décalage binaire sur la droite permet de séquencer la taille des groupes de bits.
Quand à l'opérateur & représentant un ET logique au niveau du bit, il permet d'appliquer le masque sur le groupe en cours de traitement.

Les opérations sur les bits peuvent paraître complexes aux premiers abords, mais leur utilisation peut être très pratique dans des optiques d'optimisation de calculs, de compression de l'information, ou encore de cryptage. Je ne saurais que trop vous conseiller d'approfondir le sujet.