Puisque personne n'a abordé le sujet de pourquoi ils sont utiles:
J'utilise des opérations bit à bit d'un lot lorsque l'on travaille avec des drapeaux. Par exemple, si vous voulez passer une série d'indicateurs pour une opération (par exemple, Fichier.Ouvrir, avec le mode de Lecture et le mode d'Écriture à la fois activée), vous pourriez passer comme une valeur unique. Ceci est accompli par l'affectation de chaque indicateur, il est peu propre à un bitset (byte, short, int ou long). Par exemple:
Read: 00000001
Write: 00000010
Donc, si vous voulez passer à lire ET à écrire, vous devez passer (LECTURE | ÉCRITURE) qui combine les deux en
00000011
Qui peut alors être déchiffré à l'autre extrémité comme:
if ((flag & Read) != 0) { //...
qui vérifie
00000011 &
00000001
qui renvoie
00000001
ce qui n'est pas 0, de sorte que le drapeau ne spécifiez LIRE.
Vous pouvez utiliser XOR pour alterner différents bits. J'ai utilisé ce lors de l'utilisation d'un indicateur pour préciser directionnelle entrées (Haut, Bas, Gauche, Droite). Par exemple, si un sprite se déplace horizontalement, et je veux qu'il à tourner autour de:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
J'ai simplement XOR la valeur actuelle (GAUCHE | DROITE) qui va tourner à GAUCHE et à DROITE, dans ce cas.
Le Décalage de bits est utile dans plusieurs cas.
x << y
est le même que
x * 2y
si vous avez besoin rapidement de la multiplier par une puissance de deux, mais regarder dehors pour le décalage de 1 bit vers le haut peu - cela rend le numéro de négatif, sauf si c'est non signé. Il est également utile lorsque vous traitez avec différentes tailles de données. Par exemple, la lecture d'un nombre 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. Ça finirait comme:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Les couleurs sont souvent stockées de cette manière (avec l'octet le plus significatif soit ignoré, soit utilisé comme Alpha):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Pour trouver les valeurs de nouveau, juste décale les bits vers la droite jusqu'en bas, puis masque le restant d'ordre supérieur bits:
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 le Rouge, vous être en train de faire 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)