Puisque personne n'a abordé le sujet de leur utilité:
J'utilise beaucoup les opérations au niveau du bit lorsque je travaille avec des indicateurs. Par exemple, si vous souhaitez passer une série d'indicateurs à une opération (par exemple File.Open()
, avec le mode lecture et le mode écriture tous deux activés), vous pouvez les transmettre sous la forme d'une valeur unique. Ceci est accompli en attribuant à chaque drapeau possible son propre bit dans un ensemble de bits (octet, court, entier ou long). Par exemple:
Read: 00000001
Write: 00000010
Donc si vous voulez passer en lecture ET en écriture, vous passerez (READ | WRITE) qui combine ensuite les deux
00000011
Qui peut alors être décrypté à l'autre extrémité comme:
if ((flag & Read) != 0) { //...
qui vérifie
00000011 &
00000001
qui retourne
00000001
qui n'est pas 0, donc l'indicateur spécifie READ.
Vous pouvez utiliser XOR pour basculer entre différents bits. Je l'ai utilisé lors de l'utilisation d'un drapeau pour spécifier des entrées directionnelles (haut, bas, gauche, droite). Par exemple, si un sprite se déplace horizontalement et que je veux qu'il se retourne:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Je XOR simplement la valeur actuelle avec (GAUCHE | DROITE) qui va désactiver la GAUCHE et la DROITE, dans ce cas.
Le décalage de bits est utile dans plusieurs cas.
x << y
est le même que
x * 2 y
si vous avez besoin de multiplier rapidement par une puissance de deux, mais faites attention au décalage d'un bit dans le bit supérieur - cela rend le nombre négatif à moins qu'il ne soit non signé. C'est également utile pour traiter différentes tailles de données. Par exemple, lire un entier de quatre octets:
int val = (A << 24) | (B << 16) | (C << 8) | D;
En supposant que A est l'octet le plus significatif et D le moins. Cela finirait par:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Les couleurs sont souvent stockées de cette façon (l'octet le plus significatif étant ignoré ou utilisé comme alpha):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Pour retrouver les valeurs, déplacez simplement les bits vers la droite jusqu'à ce qu'il soit en bas, puis masquez les bits d'ordre supérieur restants:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
est le même que 11111111
. Donc, essentiellement, pour Red, vous feriez ceci:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)