Como nadie ha abordado el tema de por qué son útiles:
Utilizo mucho las operaciones bit a bit cuando trabajo con banderas. Por ejemplo, si desea pasar una serie de banderas a una operación (por ejemplo,File.Open()
, con el modo de lectura y el modo de escritura habilitados), puede pasarlos como un solo valor. Esto se logra asignando a cada indicador posible su propio bit en un conjunto de bits (byte, short, int o long). Por ejemplo:
Read: 00000001
Write: 00000010
Entonces, si desea pasar de lectura Y escritura, pasaría (LEER | ESCRIBIR) que luego combina los dos en
00000011
Que luego se puede descifrar en el otro extremo como:
if ((flag & Read) != 0) { //...
que verifica
00000011 &
00000001
que vuelve
00000001
que no es 0, por lo que el indicador especifica READ.
Puede usar XOR para alternar varios bits. Lo he usado cuando uso una bandera para especificar entradas direccionales (Arriba, Abajo, Izquierda, Derecha). Por ejemplo, si un sprite se mueve horizontalmente y quiero que se dé la vuelta:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Simplemente XOR el valor actual con (IZQUIERDA | DERECHA) que apagará IZQUIERDA y DERECHA, en este caso.
Bit Shifting es útil en varios casos.
x << y
es lo mismo que
x * 2 y
si necesita multiplicar rápidamente por una potencia de dos, pero tenga cuidado con el cambio de 1 bit al bit superior; esto hace que el número sea negativo a menos que no esté firmado. También es útil cuando se trata con diferentes tamaños de datos. Por ejemplo, leer un número entero de cuatro bytes:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Suponiendo que A es el byte más significativo y D el menor. Terminaría como:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Los colores a menudo se almacenan de esta manera (con el byte más significativo ignorado o utilizado como Alfa):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Para encontrar los valores nuevamente, simplemente mueva los bits hacia la derecha hasta que esté en la parte inferior, luego oculte los bits restantes de orden superior:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
es el mismo que 11111111
. Entonces, esencialmente, para Red, estarías haciendo esto:
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)