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 PASX | ~ 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 = 1
est de type Unsigned int de taille 8 bits. Ainsi, 1 en décimal peut être représenté comme 00000001
en 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 11111111
qui correspond à 255 en décimal. Pour représenter le nombre en binaire, nous avons 0b
comme préfixe dans le littéral. Sans 0b
comme 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 00000000
ce 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 00000001
en 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 = 1
est 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 :
- Écrivez 2 sous forme binaire:
00000010
- Inversez les chiffres. 0 devient 1 et 1 devient 0:
11111101
- Ajouter 1:
11111110
C'est ainsi que le compilateur interprète le nombre binaire 1111110
comme -2
dé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 Int8
type.
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:
ETX | 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 & yBits
combine 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:
OUX | 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 | yBits
combine 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, 11111111
est équivalent à 255
en 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:
XORX | 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 yBits
combine 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, 1111100
est équivalent à 124
en 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 10001000
ce qui équivaut à 136
in 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 00000100
en binaire. En le décalant un peu vers la droite, vous obtenez 00000010
ce qui équivaut à 2
in 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, -4
est représenté comme 11111100
en binaire. En le déplaçant un peu vers la droite et en plaçant 1 dans la position vacante, vous obtenez 11111110
ce qui équivaut à -2
pour Int8
type. Par conséquent, l' print(someBits>> 1)
instruction affiche -2 à l'écran.