Manipulation de bit

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

La manipulation de bit consiste à agir sur des données au niveau d'un bit ou d'un ensemble de bits à l'aide d'opérations booléennes. En informatique, cette technique est notamment utilisée pour des opérations de bas niveau comme le contrôle des périphériques, ou encore dans certains algorithmes comme la détection et la correction d'erreur ou le cryptage, ainsi que pour l'optimisation. À l'heure actuelle néanmoins, la plupart des langages de programmation modernes permettent de s'affranchir du travail à ce niveau en offrant au programmeur de travailler directement avec des abstractions plutôt qu'avec les bits qu'elles représentent.

Les opérations permettant la manipulation des bits sont les opérations booléennes ET (AND), OU (OR), OU exclusif (XOR) et NON (NOT), ainsi que les décalages logiques et arithmétiques et les rotations.

Bit twiddling[modifier | modifier le code]

Bit twiddling ou bit bashing (manipulation "violente" de bit) est souvent utilisé dans le sens de manipulation de bit, mais quelquefois pour désigner les méthodes audacieuses ou ingénieuses de manipulation de bit. Ce terme est également utilisé de façon moins flatteuse pour désigner des manipulations longues et fastidieuses d'un logiciel lorsque les améliorations obtenues sont négligeables, tout en donnant un code source illisible pour tout autre personne que son auteur. Cette expression date des débuts de l'informatique, lorsque les utilisateurs devaient ajuster patiemment les commandes de l'ordinateur. Alors que l'informatique évoluait, les programmeurs adoptèrent ce terme pour désigner les manipulations binaires de données.

Exemple de manipulation de bit[modifier | modifier le code]

Le code ci-dessous, écrit en C détermine entre 2 entier (x et y) le plus petit et le place dans r.

// La méthode classique

if (x < y)
    r = x;
else
    r = y;

// Une méthode plus rapide sur certaines machines

r = y + ((x - y) & -(x < y));

Le symbole & représente le ET unaire en C.

Dans la plupart des cas, le programmeur choisira la première méthode. Cependant, si un tel test doit être effectué des millions de fois par seconde, le programmeur pourra exploiter sa connaissance de la représentation des entiers en binaire et utilisera la seconde méthode: celle-ci n'utilisant aucun renvoi sera plus rapide sur la plupart des processeurs.

Techniques de base[modifier | modifier le code]

La manipulation de bit pose souvent problème aux codeurs débutants, l'utilisation d'instructions assembleur pour manipuler les bits est souvent source d'embarras. C'est pourquoi, utiliser des méthodes de plus haut niveau est recommandé, puisque cela améliore la portabilité et la lisibilité du code source, sous réserve, évidemment, que le lecteur connaisse le langage utilisé.

L'exemple ci-dessous est écrit en C, mais peut être adapté à tout langage supportant les opérateurs unaires.

Mettre un bit à 1 (n est le numéro du bit):

unsigned char a |= (1 << n);

Pour forcer un bit à 1 on utilise le OU binaire car: 1 OU 0 = 1. (cf Table de vérité) En C le symbole | représente l'opérateur OU. Dans cet exemple le OU est associé à l'opérateur égal afin que la variable 'a' reprenne la même valeur pour chacun de ses bits sauf le bit que l'on a forcé à 1.

Mettre un bit à 0:

unsigned char b &= ~(1 << n);

Pour forcer un bit à 0 on utilise le ET binaire car: 1 ET 0 = 0. En C le symbole & représente l'opérateur ET. Le symbole ~ représente le NON binaire et NON 1 = 0.


Inverser la valeur du bit:

unsigned char c ^= (1 << n);

Tester la valeur d'un bit:

unsigned char e = d & (1 << n); // d ayant la valeur en octet 

Lors de la manipulation d'une grande quantité de bits constituée de plusieurs octets, on peut utiliser n = (index % 8) pour calculer le bit désiré. L'octet désiré peut également être calculé avec index / 8.

Voir aussi[modifier | modifier le code]

Références[modifier | modifier le code]