1. Aperçu des opérations bit à bit

Dans les ordinateurs modernes, toutes les données sont stockées sous forme binaire, c'est-à-dire deux états : 0 et 1. Les opérations effectuées par les ordinateurs sur des données binaires (telles que l'addition, la soustraction, la multiplication et la division) sont appelées opérations bit à bit, qui sont des opérations qui portent sur chaque bit d'un nombre binaire.

Pour mieux comprendre les opérations bit à bit, voici un exemple simple : supposons que nous ayons le code suivant pour effectuer l'addition de deux entiers :

int a = 35;
int b = 47;
int c = a + b;

L'ordinateur convertit ces deux entiers sous forme binaire, puis effectue l'addition :

35:  0010 0011
47:  0010 1111
----------------
82:  0101 0010

Par conséquent, par rapport à l'utilisation directe des+、-、*、/opérateurs, l'utilisation raisonnable des opérations bit à bit peut améliorer significativement l'efficacité d'exécution du code sur la machine.

2. Aperçu des opérations bit à bit

Symbole Description Règle de l'opération
& et Le résultat est 1 uniquement lorsque les deux bits sont 1.
| ou Le résultat est 0 uniquement lorsque les deux bits sont 0.
^ OU EXCLUSIF Le résultat est 0 si les deux bits sont identiques, et 1 s'ils sont différents.
~ NON 0 devient 1, et 1 devient 0.
<< Décalage à gauche Tous les bits sont décalés vers la gauche d'un certain nombre de positions ; les bits de poids fort sont supprimés et les bits de poids faible sont remplis avec 0.
>> Décalage à droite Tous les bits sont décalés vers la droite d'un certain nombre de positions ; les bits de poids fort sont remplis avec 0 ou le bit de signe.

3. Opérateur AND bit à bit (&)

Définition: effectue une opération « AND » sur les bits binaires des deux opérandes de données impliqués.

Règle de l'opération:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Résumé: Ce n'est que lorsque les deux bits sont à 1 que le résultat est 1 ; sinon, le résultat est 0.

Par exemple :3 & 5i.e.0000 0011 & 0000 0101 = 0000 0001, par conséquent3 & 5la valeur est 1.

Remarque: Les nombres négatifs participent aux opérations AND bit à bit sous forme de complément à deux.

Applications:

  1. Mise à zéro: Si vous voulez mettre une unité à zéro, il suffit de lui appliquer un AND avec une valeur dont tous les bits sont à zéro ; le résultat est zéro.
  2. Extraire les bits spécifiés d'un nombre: Par exemple, prenez lesX = 1010 11104 bits de poids faible d'un nombre, il suffit de trouver un autre nombreY = 0000 1111, puisX & Y = 0000 1110vous pouvez obtenirXles bits spécifiés.
  3. Déterminer impair ou pair: En vérifiant si le bit de poids faible est 0 ou 1 pour déterminer la parité, vous pouvez utiliserif ((a & 1) == 0)au lieu deif (a % 2 == 0)pour détermineras'il est pair.

4. Opérateur OR bit à bit (|)

Définition: effectue une opération « OR » sur les bits binaires des deux opérandes impliqués.

Règle de l'opération:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Résumé: Tant que l'un d'eux vaut 1, le résultat est 1.

Par exemple :3 | 5i.e.0000 0011 | 0000 0101 = 0000 0111, par conséquent3 | 5la valeur est 7.

Remarque: Les nombres négatifs participent aux opérations OR bit à bit sous forme de complément à deux.

Applications:

  1. Mettre certains bits à 1: Par exemple, pour mettre lesX = 1010 11104 bits de poids faible d'un nombre à 1, il suffit de trouver un autre nombreY = 0000 1111, puisX | Y = 1010 1111vous pouvez l'obtenir.

5. Opérateur XOR bit à bit (^)

Définition: effectue une opération « XOR » sur les bits binaires des deux opérandes de données impliqués.

Règle de l'opération:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Résumé: Si les bits correspondants sont identiques, le résultat est 0 ; s'ils sont différents, le résultat est 1.

Propriétés:

  1. Loi commutative
  2. Loi associative :(a ^ b) ^ c == a ^ (b ^ c)
  3. Pour tout nombrex, on ax ^ x = 0,x ^ 0 = x
  4. Auto-inverse :a ^ b ^ b = a ^ 0 = a

Applications:

  1. Inverser les bits spécifiés: Par exemple, pour inverser leX = 1010 11104 bits de poids faible d'un nombre, il suffit de trouver un autre nombreY = 0000 1111, puisX ^ Y = 1010 0001vous pouvez l'obtenir.
  2. XOR avec 0 conserve la valeur inchangée: par exemple1010 1110 ^ 0000 0000 = 1010 1110
  3. Échanger deux nombres:
void Swap(int &a, int &b) {
if (a != b) {
    a ^= b;
    b ^= a;
    a ^= b;
}
}

6. Opérateur NOT bit à bit (~)

Définition: effectue une opération « NOT » sur les bits binaires de l'unique opérande concerné.

Règle de l'opération:

~1 = 1111 1110
~0 = 1111 1111

C’est-à-dire :

~1 = -2
~0 = -1

Résumé: Transformer 0 en 1, et 1 en 0.

Applications:

  1. Mettre le bit de poids faible d'un nombre à zéro: Par exemple, pour mettreale bit de poids faible d'un nombre à 0, cela peut être exprimé par :a & ~1。~1la valeur de ... est1111 1111 1111 1110, puis effectuer une opération « AND », et le bit de poids faible sera certainement 0.

7. Opérateur de décalage à gauche (<<)

Définition: Décaler tous les bits binaires d'un opérande vers la gauche d'un certain nombre de positions ; les bits de poids fort sont écartés et les bits de poids faible sont remplis avec 0.

Par exemple, soita = 1010 1110,a = a << 2vaales bits binaires de ... soient décalés vers la gauche de 2 positions, avec des zéros ajoutés à droite, ce qui donnea = 1011 1000。

Si les bits de poids fort écartés lors du décalage à gauche ne contiennent pas de 1, alors chaque décalage à gauche d'une position équivaut à multiplier le nombre par 2.

8. Opérateur de décalage à droite (>>)

Définition: Décaler tous les bits binaires d'un nombre vers la droite d'un certain nombre de positions ; les bits de poids fort sont remplis avec 0 ou le bit de signe, et le côté droit est écarté.

Par exemple,a = a >> 2vaales bits binaires de ... sont décalés vers la droite de 2 positions, avec le côté gauche rempli de 0 ou du bit de signe, selon que le nombre est positif ou négatif.

Chaque fois qu'un opérande est décalé vers la droite d'une position, cela équivaut à diviser le nombre par 2.

9. Opérateurs d'affectation composés

Les opérateurs bit à bit sont combinés avec les opérateurs d'affectation pour former de nouveaux opérateurs d'affectation composés, qui sont :

  • &= Exemple :a &= best équivalent àa = a & b
  • |= Exemple :a |= best équivalent àa = a | b
  • >>= Exemple :a >>= best équivalent àa = a >> b
  • <<= Exemple :a <<= best équivalent àa = a << b
  • ^= Exemple :a ^= best équivalent àa = a ^ b

Les règles de fonctionnement sont similaires à celles des opérateurs d'affectation composés mentionnés ci-dessus.

Opérations bit à bit sur des données de longueurs différentes:

Si deux données de longueurs différentes subissent une opération bit à bit, le système les aligne par leur extrémité droite, puis effectue l'opération bit à bit.

Prenons comme exemple l'opération « AND » :

En langage C,longtype occupe 4 octets,inttype occupe 2 octets. Si unelongdonnée de type et uneintdonnée de type subissent une « opération AND », après alignement à droite, les bits manquants à gauche sont remplis selon les trois cas suivants :

  1. Si la donnée entière est positive, les bits à gauche sont remplis avec 16 zéros.
  2. Si les données entières sont négatives, les bits de gauche sont remplis avec 16 uns.
  3. Si les données entières sont non signées, les bits de gauche sont également remplis avec 16 zéros.

Par exemple :

long a = 123;
int b = 1;
long result = a & b;
long a = 123;
unsigned int b = 1;
long result = a & b;