Opérateurs Swift Bitwise et Bit Shift (avec des exemples)

Dans ce didacticiel, vous découvrirez les différentes opérations au niveau du bit dans Swift. Ceux-ci sont utilisés pour le calcul au niveau du bit dans une expression.

Un bit est utilisé pour désigner un chiffre binaire. Un chiffre binaire peut avoir deux valeurs possibles, soit 0 ou 1. En tant que programmeur de niveau débutant, vous n'avez pas à travailler avec des opérations au niveau du bit.

Travailler avec des types de données primitifs tels que: entier, flottant, booléen, chaîne, etc. suffit. Vous devrez peut-être travailler au niveau du bit lorsque vous avez affaire à une programmation de bas niveau.

Swift fournit un riche ensemble d'opérateurs, en dehors des opérateurs de base, pour manipuler les bits. Ces opérateurs sont similaires aux opérateurs logiques, sauf qu'ils fonctionnent sur des représentations binaires de données (bits).

Les opérateurs au niveau du bit sont des opérateurs utilisés pour modifier les bits individuels d'un opérande. L'opérande est une variable ou une constante dans laquelle l'opération est effectuée.

Tous les opérateurs binaires disponibles dans swift sont répertoriés ci-dessous:

1. Opérateur NOT au niveau du bit

Il est représenté par le ~signe tilde et peut être appliqué sur un seul opérande. Cela inverse tous les bits. c'est-à-dire change 1 en 0 et 0 en 1.

Si x est une variable / constante qui contient une valeur binaire, c'est-à-dire 0 ou 1. L'opération non au niveau du bit sur la variable x peut être représentée dans le tableau ci-dessous:

NE PAS
X ~ x
0 1
1 0

Exemple 1: Opérateur NOT au niveau du bit pour un entier non signé

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 254

Dans le programme ci-dessus, l'instruction let initalNumber:UInt8 = 1est de type Unsigned int de taille 8 bits. Ainsi, 1 en décimal peut être représenté comme 00000001en binaire.

L'opérateur pas au niveau du bit change tous les bits d'une variable ou d'une constante, le bit 0 est changé en 1 et 1 en 0. Ainsi, invertedNumber contient des bits 11111110. Après l'avoir converti en décimal, il est représenté par 254. Ainsi, l'instruction print(invertedNumber)affiche 254 à l'écran.

Vous pouvez également effectuer un opérateur bit à bit directement dans les bits comme:

Exemple 2: Opérateur NOT au niveau du bit en bits

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 0

initialBits contient une valeur binaire 11111111qui correspond à 255 en décimal. Pour représenter le nombre en binaire, nous avons 0bcomme préfixe dans le littéral. Sans 0bcomme préfixe, il le traitera comme un entier normal et vous obtiendrez une erreur de débordement (UInt8 ne peut stocker que des nombres de 0 à 255).

Depuis, nous avons utilisé l'opérateur pas au niveau du bit, cela change tous les 1 en 0. Ainsi, la constante invertedBits contient 00000000ce qui équivaut à 0 dans UInt8.

Exemple 3: Opérateur NOT au niveau du bit pour un entier signé

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 -2

Dans le programme ci-dessus, 1 en décimal peut être représenté comme 00000001en binaire. L'opérateur pas au niveau du bit change tous les bits d'une variable ou d'une constante, le bit 0 est changé en 1 et 1 en 0. Ainsi, invertedNumber contient des bits 11111110. Cela devrait afficher 254 à l'écran. Mais renvoie plutôt -2. Étrange, non ?? Explorons ci-dessous comment cela s'est produit.

let initalNumber:Int = 1est un entier signé qui peut contenir des entiers positifs et négatifs. C'est pourquoi lorsque nous avons appliqué l'opérateur non pour un entier signé, le binaire renvoyé peut également représenter un nombre négatif.

Comment le compilateur a-t-il interprété -2 comme 11111110 en binaire?

Le compilateur a utilisé le complément de Two pour représenter des entiers. Pour obtenir la notation négative du complément à deux d'un entier, vous devez d'abord écrire le nombre en binaire, puis inverser les chiffres et en ajouter un au résultat.

Étapes pour connaître le complément à deux de -2 :

  1. Écrivez 2 sous forme binaire: 00000010
  2. Inversez les chiffres. 0 devient 1 et 1 devient 0:11111101
  3. Ajouter 1: 11111110

C'est ainsi que le compilateur interprète le nombre binaire 1111110comme -2décimal. Mais, il y a une petite torsion que le compilateur a faite que nous n'avons pas remarquée. Il a également déduit le type de invertedNumber comme Int8type.

Pour comprendre cela, voyons un exemple ci-dessous:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 -2 254

Dans l'exemple ci-dessus, le compilateur a traité le nombre binaire à -2 en décimal uniquement pour l'entier 8 bits signé. Par conséquent, l'instruction print(Int8(bitPattern: 0b11111110))affiche -2 à l'écran.

Mais pour le type entier normal dont la taille est de 32/64 bits et peut contenir de grandes valeurs, il interprète la valeur comme 254. , Déclaration conséquent print(0b11111110)émet 254 dans l'écran.

2. Opérateur AND au niveau du bit

Il est représenté par &et peut être appliqué sur deux opérandes. L'opérateur AND compare deux bits et renvoie 1 si les deux bits sont 1, sinon renvoie 0.

Si x et y sont des variables / constantes qui contiennent une valeur binaire, c'est-à-dire 0 ou 1. L'opération ET au niveau du bit sur x et y peut être représentée dans le tableau ci-dessous:

ET
X y x & y
0 0 0
0 1 0
1 1 1
1 0 0

Exemple 5: opération AND au niveau du bit

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 Binaire: 10000011131 

Dans le programme ci-dessus, l'instruction let result = xBits & yBitscombine les bits de deux opérandes xBits et yBits. Il renvoie 1 si les deux bits sont 1 sinon il renvoie 0.

String(value , radix: )l'initialiseur est utilisé pour représenter le nombre dans un système numérique différent. Si nous fournissons la valeur de base 2. Il convertit le nombre en système numérique binaire. De même, nous pouvons utiliser 16 pour hexadécimal et 10 pour décimal.

La déclaration print("Binary:",String(result, radix: 2))sorties binaire: 10000011 dans l'écran. 10000011équivaut à 131 en décimal, l'instruction print(result)renvoie 131 dans la console.

3. Opérateur OR au niveau du bit

Il est représenté comme |et peut être appliqué sur deux opérandes. L'opérateur OR au niveau du bit compare deux bits et génère un résultat de 1 si une ou plusieurs de ses entrées sont 1 sinon 0.

Si x et y sont des variables / constantes qui contiennent une valeur binaire, c'est-à-dire 0 ou 1. L'opération OU au niveau du bit sur x et y peut être représentée dans le tableau ci-dessous:

OU
X y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Exemple 6: opération OR au niveau du bit

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 Binaire: 11111111 255 

Dans le programme ci-dessus, l'instruction let result = xBits | yBitscombine les bits de deux constantes xBits et yBits. Il renvoie 1 si l'un des bits est égal à 1, sinon il renvoie 0.

La déclaration print("Binary:",String(result, radix: 2))sorties binaire: 11111111 dans l'écran. Depuis, 11111111est équivalent à 255en décimal, l'instruction print(result)sorties 255 dans l'écran.

4. Opérateur XOR au niveau du bit

Il est représenté comme ^et peut être appliqué sur deux opérandes. L'opérateur XOR compare deux bits et génère un résultat de 1 si exactement l'une de ses entrées est 1, sinon il renvoie 0.

Si x et y sont des variables / constantes qui contiennent une valeur binaire, c'est-à-dire 0 ou 1. L'opération XOR bit à bit sur x et y peut être représentée dans le tableau ci-dessous:

XOR
X y x y
0 0 0
0 1 1
1 1 0
1 0 1

Exemple 7: opération XOR au niveau du bit

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 Binaire: 1111100124 

Dans le programme ci-dessus, l'instruction let result = xBits yBitscombine les bits de deux constantes xBits et yBits. Il renvoie 1 si exactement l'un des bits est 1 sinon il renvoie 0.

La déclaration print("Binary:",String(result, radix: 2))sorties binaire: 1111100 (équivalent à 01.111.100) dans l'écran. Depuis, 1111100est équivalent à 124en décimal, l'instruction print(result)sorties 124 dans l'écran.

5. Opérateur de décalage au niveau du bit

Ces opérateurs sont utilisés pour déplacer tous les bits d'un nombre vers la gauche ou la droite d'un certain nombre de places et peuvent être appliqués sur un seul opérande. Il est représenté par <<ou >>.

Il existe deux types d'opérateurs d'équipe:

Opérateur de décalage gauche au niveau du bit

  • Désigné comme <<
  • Cela provoque le décalage des bits vers la gauche spécifié par le nombre suivi de <<.
  • Les positions de bit qui ont été libérées par l'opération de décalage sont remplies à zéro.
  • Le décalage des bits d'un entier vers la gauche d'une position double sa valeur

Exemple 8: Opérateur de décalage gauche au niveau du bit

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 136

Dans le programme ci-dessus, nous avons utilisé l'opérateur de décalage gauche. Utiliser <<1 signifie décaler le bit de 1 vers la gauche. Les chiffres sont décalés vers la gauche d'une position, et le dernier chiffre à droite est rempli d'un zéro.

Vous pouvez également voir que le chiffre qui est décalé "de la fin" du côté gauche est perdu. Il ne s'enroule plus par la droite. Le décalage d'un bit vers la gauche supprime le 1 du binaire et ajoute 0 à droite pour remplir la valeur décalée et le reste des autres bits est décalé de 1 vers la position gauche.

Cela renvoie 10001000ce qui équivaut à 136in UInt8. Par conséquent, l' print(someBits << 1)instruction affiche 136 à l'écran.

Opérateur de décalage droit au niveau du bit

  • Désigné comme >>
  • Cela fait que les bits sont décalés vers la droite du nombre suivi de >>
  • Pour les nombres non signés, les positions de bit qui ont été libérées par l'opération de décalage sont remplies à zéro.
  • Pour les nombres signés (nombres qui peuvent également être négatifs), le bit de signe est utilisé pour remplir les positions de bit vacantes. En d'autres termes, si le nombre est positif, 0 est utilisé et si le nombre est négatif, 1 est utilisé.
  • Le déplacer vers la droite d'une position réduit de moitié sa valeur.

Exemple 9: Opérateur de décalage vers la droite au niveau du bit pour un entier non signé

 let someBits: UInt8 = 4 print(someBits>> 1) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 2

Dans le programme ci-dessus, nous avons utilisé l'opérateur de décalage vers la droite sur un entier non signé. Utiliser >>1 signifie décaler le bit de 1 vers la droite. Les positions de bit qui ont été libérées par l'opération de décalage sont toujours remplies à zéro sur un entier non signé.

Depuis, 4 est représenté comme 00000100en binaire. En le décalant un peu vers la droite, vous obtenez 00000010ce qui équivaut à 2in UInt8. Par conséquent, l' print(someBits>> 1)instruction affiche 2 à l'écran.

Exemple 10: Opérateur de décalage vers la droite au niveau du bit pour un entier signé

 let someBits:Int = -4 print(someBits>> 1) 

Lorsque vous exécutez le programme ci-dessus, la sortie sera:

 -2

Dans le programme ci-dessus, nous avons utilisé l'opérateur de décalage vers la droite sur un entier non signé. Contrairement aux nombres positifs, en utilisant >>pour les nombres négatifs, 1 est utilisé pour remplir la place vacante, au lieu de 0.

Depuis, -4est représenté comme 11111100en binaire. En le déplaçant un peu vers la droite et en plaçant 1 dans la position vacante, vous obtenez 11111110ce qui équivaut à -2pour Int8type. Par conséquent, l' print(someBits>> 1)instruction affiche -2 à l'écran.

Articles intéressants...