Ya que nadie ha abordado el tema de por qué son útiles:
utilizo operaciones bit a bit mucho cuando se trabaja con fl ags. Por ejemplo, si desea pasar una serie de banderas a una operación (por ejemplo, Archivo.Abrir, con el modo Leer y el modo Escritura ambos habilitados), podría pasarlos como un valor único. Esto se logra asignando cada bandera posible su propio bit en un conjunto de bits (byte, corto, int o largo).Por ejemplo:
Read: 00000001
Write: 00000010
Así que si quieres pasar leer y escribir, que pasaría (Leer | ESCRITURA) que luego combina los dos en
00000011
que luego pueden ser descifrados en el otro extremo como:
if ((flag & Read) != 0) { //...
que comprueba
00000011 &
00000001
que devuelve
00000001
que no es 0, por lo que el indicador no especifica LEER.
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 lo quiero para dar la vuelta:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
simplemente XOR el valor actual con (IZQUIERDA | DERECHA) que gire a la izquierda y la derecha en, en este caso.
El cambio de bit es útil en varios casos.
x << y
es lo mismo que
x * 2 y
si es necesario multiplicar rápidamente por una potencia de dos, pero cuidado con el cambio de 1 bit en el bit superior - esto hace que el número sea negativo a menos que no esté firmado. También es útil cuando se trata de diferentes tamaños de datos. Por ejemplo, leyendo un 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 menos. Sería terminar como:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
colores son a menudo almacenados de esta manera (con el byte más significativo sea ignorado o se utilizan como Alfa):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Para encontrar los valores de nuevo, simplemente desplazar los bits hacia la derecha hasta que esté en la parte inferior, a continuación, enmascarar los bits de orden superior restantes:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF es la misma que 11111111. Así que, esencialmente, para rojo, que estaría 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)
Soy una persona que escribe el código principalmente sólo por diversión y He escrito un microkernel funcional (pero limitado). En lenguaje ensamblador x86. Por diversión. : D – Artelius
Para más preguntas, es posible que desee agregar una nueva pregunta SO y hacer referencia a esta. Probablemente obtendrás un mejor conjunto de respuestas de esa manera. –