Article de reference

Opération bit à bit

L' opération NON bit à bit , ou complément bit à bit , est une opération unaire qui effectue la négation logique de chaque bit, formant ainsi le complément à un de la valeur bin...

L' opération NON bit à bit , ou complément bit à bit , est une opération unaire qui effectue la négation logique de chaque bit, formant ainsi le complément à un de la valeur binaire donnée. Les bits à 0 deviennent des 1, et ceux à 1 deviennent des 0. Par exemple :

PAS 0 111 (7 en décimal) = 1 000 (décimal 8)
NON 10101011 (décimal 171) = 01010100 (décimal 84)

Le résultat est égal au complément à deux de la valeur moins un. Si l'on utilise l'arithmétique du complément à deux, alors NOT x = -x − 1

Pour les entiers non signés , le complément bit à bit d'un nombre est son image miroir à mi-chemin de l'intervalle de valeurs de cet entier. Par exemple, pour les entiers non signés 8 bits, NOT x = 255 - xon a : 0 × 255 = 0 × 255, ce qui peut se représenter graphiquement par une ligne descendante qui inverse l'ordre croissant des valeurs de 0 à 255, pour obtenir une valeur décroissante de 255 à 0. Un exemple simple, mais parlant, d'utilisation consiste à inverser une image en niveaux de gris où chaque pixel est stocké sous forme d'entier non signé.

ET

Opération ET bit à bit sur des entiers de 4 bits

L' opération ET bit à bit est une opération binaire qui prend deux représentations binaires de même longueur et effectue l' opération logique ET sur chaque paire de bits correspondants. Ainsi, si les deux bits à la position comparée sont à 1, le bit de la représentation binaire résultante est 1 (1 × 1 = 1) ; sinon, le résultat est 0 (1 × 0 = 0 et 0 × 0 = 0). Par exemple :

 010 1 (décimal 5) ET 001 1 (décimal 3) = 000 1 (décimal 1)

Cette opération permet de déterminer si un bit particulier est activé (1) ou désactivé (0). Par exemple, étant donné la séquence binaire 0011 (3 en décimal), pour déterminer si le deuxième bit est activé, on utilise un ET bit à bit avec une séquence binaire contenant uniquement des 1 dans le deuxième bit :

 00 1 1 (décimal 3) ET 00 1 0 (décimal 2) = 00 1 0 (décimal 2)

Puisque le résultat 0010 est différent de zéro, nous savons que le deuxième bit du motif d'origine a été activé. On parle alors de masquage de bits . (Par analogie, l'utilisation de ruban adhésif de masquage permet de recouvrir, ou de masquer , les parties qui ne doivent pas être modifiées ou celles qui ne présentent aucun intérêt. Dans ce cas, les valeurs 0 masquent les bits qui ne sont pas pertinents.)

L'opérateur ET bit à bit permet d'effacer certains bits (ou drapeaux ) d'un registre , chaque bit représentant un état booléen . Cette technique est un moyen efficace de stocker plusieurs valeurs booléennes en utilisant le moins de mémoire possible.

Par exemple, 0110 (6 en décimal) peut être considéré comme un ensemble de quatre indicateurs numérotés de droite à gauche, où le premier et le quatrième indicateurs sont à zéro (0), et les deuxième et troisième indicateurs sont à un (1). Le troisième indicateur peut être désactivé en utilisant un ET bit à bit avec le motif qui ne comporte qu'un zéro dans son troisième bit :

 0 1 10 (décimal 6) ET 1 0 11 (décimal 11) = 0 0 10 (décimal 2)

Grâce à cette propriété, il est facile de déterminer si un nombre binaire est pair ou impair en vérifiant la valeur de son bit de poids faible. Reprenons l'exemple ci-dessus :

 011 0 (décimal 6) ET 000 1 (décimal 1) = 000 0 (décimal 0)

Puisque 6 ET 1 font zéro, 6 est divisible par deux et donc pair.

OU

OU bit à bit d'entiers de 4 bits

L' opération OU bit à bit est une opération binaire qui prend deux séquences de bits de même longueur et effectue l' opération OU logique inclusif sur chaque paire de bits correspondants. Le résultat est 0 si les deux bits sont à 0, et 1 sinon. Par exemple :

 0 101 (décimal 5) OU 0 011 (décimal 3) = 0 111 (décimal 7)

L'opérateur OU bit à bit permet de mettre à 1 les bits sélectionnés du registre décrit ci-dessus. Par exemple, le quatrième bit de 0010 (2 en décimal) peut être activé en effectuant un OU bit à bit avec le motif où seul le quatrième bit est activé :

0 0 1 0 (décimal 2) OU 1 0 0 0 (décimal 8) = 1 0 1 0 (décimal 10)

XOR

XOR bit à bit d'entiers de 4 bits

L' opération XOR bit à bit est une opération binaire qui prend deux séquences de bits de même longueur et effectue l' opération OU exclusif logique sur chaque paire de bits correspondants. Le résultat est 1 si un seul des bits est à 1, et 0 si les deux bits sont à 0 ou si les deux bits sont à 1. On compare ainsi deux bits : le résultat est 1 s'ils sont différents et 0 s'ils sont identiques. Par exemple :

 0 10 1 (décimal 5) XOR 0 01 1 (décimal 3) = 0 11 0 (décimal 6)

L'opération XOR bit à bit permet d'inverser certains bits d'un registre (également appelée basculement). Chaque bit peut être inversé en effectuant un XOR avec 1. Par exemple, pour la séquence binaire 0010 (2 en décimal), les deuxième et quatrième bits peuvent être inversés par un XOR bit à bit avec une séquence binaire contenant 1 en deuxième et quatrième position.

0 0 1 0 (décimal 2) XOR 1 0 1 0 (décimal 10) = 1 0 0 0 (décimal 8)

Cette technique peut être utilisée pour manipuler des séquences binaires représentant des ensembles d'états booléens.

Les programmeurs en langage assembleur et les compilateurs optimisants utilisent parfois l'opération XOR comme raccourci pour initialiser à zéro la valeur d'un registre. L'opération XOR d'une valeur avec elle-même donne toujours zéro, et sur de nombreuses architectures, cette opération nécessite moins de cycles d'horloge et de mémoire que le chargement d'une valeur nulle et son enregistrement dans le registre.

Si l'on considère l'ensemble des chaînes binaires de longueur fixe n (c'est-à-dire les mots machine ) comme un espace vectoriel à n dimensions

Équivalents mathématiques

En supposant , pour les entiers non négatifs, les opérations bit à bit peuvent s'écrire comme suit :

Table de vérité de tous les opérateurs logiques binaires

Il existe 16 états possibles pour deux variables binaires ; cela définit une table de vérité , appelée table de consultation LUT2 , fonction booléenne d'ordre k = 2 (2 entrées). Certains fournisseurs utilisent le terme « connecteur » pour les instructions comportant un champ de 4 bits identifiant le connecteur binaire spécifique ; d'autres utilisent le terme « opération booléenne » pour les 16 codes d'opération distincts.

Voici les opérations équivalentes au niveau du bit sur deux bits P et Q :

L'équivalent ternaire est une fonction booléenne LUT3 d'ordre k=3 (trois entrées), donnant lieu à une table de 256 opérations, et en informatique, elle est appelée instruction logique ternaire bit à bit .

Décalages de bits

bits déplace la séquence de bits d’un octet de la façon suivante :

Décalage arithmétique

Lors d'un décalage logique (décalage de remplissage à zéro), des zéros sont insérés pour remplacer les bits supprimés. Par conséquent, les décalages logiques et arithmétiques à gauche sont exactement identiques.

Cependant, comme le décalage logique à droite insère des bits de valeur 0 dans le bit le plus significatif, au lieu de copier le bit de signe, il est idéal pour les nombres binaires non signés, tandis que le décalage arithmétique à droite est idéal pour les nombres binaires signés en complément à deux .

Changement circulaire

Une autre forme de décalage est le décalage circulaire , la rotation bit à bit ou la rotation de bits .

Tourner

Dans cette opération, parfois appelée rotation sans retenue , les bits sont « pivotés » comme si les extrémités gauche et droite du registre étaient jointes. La valeur décalée à droite lors d'un décalage à gauche est celle décalée à gauche, et inversement pour un décalage à droite. Cette technique est utile lorsqu'il est nécessaire de conserver tous les bits existants et est fréquemment utilisée en cryptographie numérique .

Rotation dans le transport

La rotation par retenue est une variante de l'opération de rotation, où le bit décalé vers l'intérieur (à chaque extrémité) est l'ancienne valeur du drapeau de retenue, et le bit décalé vers l'extérieur (à l'autre extrémité) devient la nouvelle valeur du drapeau de retenue.

Une simple rotation avec retenue permet de simuler un décalage logique ou arithmétique d'une position en configurant au préalable le bit de retenue. Par exemple, si ce bit est à 0, il x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEs'agit d'un décalage logique à droite ; s'il contient une copie du bit de signe, il x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEs'agit d'un décalage arithmétique à droite. C'est pourquoi certains microcontrôleurs, comme les PIC d'entrée de gamme, ne proposent que les instructions de rotation et de rotation avec retenue , sans gérer les décalages logiques ou arithmétiques.

La rotation avec retenue est particulièrement utile pour les décalages de nombres supérieurs à la taille de mot native du processeur . En effet, si un grand nombre est stocké dans deux registres, le bit décalé d'une extrémité du premier registre doit être inséré à l'autre extrémité du second. Grâce à cette technique, ce bit est « sauvegardé » dans le drapeau de retenue lors du premier décalage, prêt à être inséré lors du second sans préparation supplémentaire.

Dans les langues de haut niveau

En C et C++, les opérateurs de décalage logique sont « » pour le décalage à gauche et « » pour le décalage à droite. Le nombre de positions à décaler est fourni comme second argument de l'opérateur. Par exemple :<<>>

x = y << 2 ;

attribue xle résultat d'un décalage yde deux bits vers la gauche, ce qui équivaut à une multiplication par quatre.

Les décalages peuvent entraîner un comportement défini par l'implémentation ou un comportement indéfini ; il convient donc d'être prudent lors de leur utilisation. En C et C++, un décalage d'un nombre de bits supérieur ou égal à la taille du mot produit un comportement indéfini. Le décalage à droite d'une valeur négative est défini par l'implémentation et déconseillé par les bonnes pratiques de programmation ; le décalage à gauche d'une valeur signée produit un comportement indéfini si le résultat ne peut être représenté dans le type de résultat.

En C#, le décalage à droite est un décalage arithmétique lorsque le premier opérande est un entier (int) ou un entier long (long). Si le premier opérande est de type entier non signé (uint) ou entier long (ulong), le décalage à droite est un décalage logique.

décalages circulaires

uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( 32 - n ));

Cependant, un décalage de 0bits entraîne un comportement indéfini dans l'expression de droite (x >> (32 - n))car 32 - 0est 32, et 32est hors de l'intervalle 0-31 inclus. Une deuxième tentative pourrait donner

uint32_t x = ..., n = ...; uint32_t y = n ? ( x << n ) | ( x >> ( 32 - n )) : x ;

Le décalage est testé afin de s'assurer qu'il n'induit pas de comportement indéfini. Cependant, cette branche ajoute un chemin d'exécution supplémentaire et offre une opportunité d'analyse temporelle et d'attaque, ce qui est généralement inacceptable dans les logiciels à haute intégrité. De plus, le code est compilé en plusieurs instructions machine, ce qui est souvent moins efficace que l'utilisation des instructions natives du processeur.

Pour éviter les comportements indéfinis et les branchements sous GCC et Clang , il est recommandé de procéder comme suit. Ce modèle est reconnu par de nombreux compilateurs, et le compilateur émettra une seule instruction de rotation :

uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( - n & 31 ));

Il existe également des fonctions intrinsèques spécifiques au compilateur implémentant des décalages circulaires , telles que `_rotl8`, `_rotl16` , `_rotr8` et `_rotr16` dans Microsoft Visual C++ . Clang fournit des fonctions intrinsèques de rotation pour la compatibilité avec Microsoft, mais celles-ci souffrent des problèmes mentionnés précédemment. GCC 15 a introduit les fonctions intrinsèques `rotl` __builtin_stdc_rotate_leftet ` __builtin_stdc_rotate_rightrotr`, mais ne parvient pas à les optimiser correctement. Intel fournit également des fonctions intrinsèques x86 .

Java

<>>>>><<<

Plus de détails sur les opérateurs de décalage Java :

  • Les opérateurs <<(décalage à gauche), >>(décalage à droite signé) et >>>(décalage à droite non signé) sont appelés opérateurs de décalage .
  • Le type de l'expression de décalage est le type promu de l'opérande de gauche. Par exemple, aByte >>> 2est équivalent à .((int)aByte)>>>2
  • Si le type promu de l'opérande de gauche est un entier (int), seuls les cinq bits de poids faible de l'opérande de droite sont utilisés comme distance de décalage. Cela revient à appliquer à l'opérande de droite l'opérateur logique ET bit à bit & avec le masque 0x1f (0b11111). La distance de décalage effectivement utilisée est donc toujours comprise entre 0 et 31 inclus.
  • Si le type promu de l'opérande de gauche est long, seuls les six bits de poids faible de l'opérande de droite sont utilisés comme distance de décalage. Cela revient à appliquer à l'opérande de droite l'opérateur logique ET bit à bit & avec la valeur de masque 0x3f (0b111111). La distance de décalage effectivement utilisée est donc toujours comprise entre 0 et 63 inclus.
  • La valeur de de n positions de bits vers la droite avec une extension à zéro.
  • Dans les opérations sur les bits et les décalages, le type byteest implicitement converti en int. Si la valeur de l'octet est négative, le bit de poids fort est à 1, puis des 1 sont utilisés pour remplir les octets supplémentaires dans l'entier. Ainsi, donnera .byteb1=-5;inti=b1|0x0200;

    JavaScript

    En Pascal, ainsi que dans tous ses dialectes (comme Object Pascal et Standard Pascal ), les opérateurs de décalage logique à gauche et à droite sont respectivement «shl » et «shr ». Même pour les entiers signés, « » shrse comporte comme un décalage logique et ne copie pas le bit de signe. Le nombre de positions à décaler est donné comme deuxième argument. Par exemple, l'instruction suivante assigne à x le résultat du décalage de y de deux bits vers la gauche :

    x := y shl 2 ;

Autre

Applications

Les opérations bit à bit sont particulièrement nécessaires dans la programmation de bas niveau, comme les pilotes de périphériques , les graphismes de bas niveau, l'assemblage et le décodage des paquets de protocoles de communication.

Bien que les machines disposent souvent d'instructions intégrées efficaces pour effectuer des opérations arithmétiques et logiques, toutes ces opérations peuvent être réalisées en combinant les opérateurs bit à bit et le test de zéro de diverses manières. Par exemple, voici une implémentation en pseudocode de la multiplication égyptienne antique montrant comment multiplier deux entiers quelconques a( bsupérieurs aà b) en utilisant uniquement des décalages de bits et l'addition :

c 0 tant que b 0 si ( b et 1 ) 0 c c + a décaler a de 1 vers la gauche décaler b de 1 vers la droite retourner c

Un autre exemple est une implémentation en pseudocode de l'addition, montrant comment calculer la somme de deux entiers aen butilisant des opérateurs bit à bit et le test de zéro :

tant que a 0, c b et a b b , XOR a, décaler c de 1 , a c, retourner b

algèbre booléenne

Les opérations en haut de cette liste sont exécutées en premier. Consultez l'article principal pour une liste plus complète.

  • ( )
  • ~ -
  • * /%
  • + -
  • << >>
  • &
  • ^
  • |

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index