Porque son operaciones fundamentales.
Por la misma línea de pensamiento, se podría argumentar que la suma tiene pocos usos en el mundo real, ya que se puede reemplazar por completo por sustracción (y negación) y multiplicación. Pero seguimos sumando porque es una operación fundamental.
Y no piense por un momento que solo porque no haya visto mucha necesidad de operaciones bit a bit no significa que no se usen con mucha frecuencia. De hecho, he usado operaciones bit a bit en casi todos los idiomas que he usado para cosas como el enmascaramiento de bits.
Fuera de mi cabeza, he usado operaciones bit a bit para el procesamiento de imágenes, campos de bits y banderas, procesamiento de texto (por ejemplo, todos los caracteres de una clase en particular a menudo comparten un patrón de bits común), codificación y decodificación de datos serializados, decodificación de VM o CPU códigos de operación, y así sucesivamente. Sin operaciones bit a bit, la mayoría de estas tareas requerirían operaciones muchas veces más complejas para realizar la tarea de manera menos confiable o con una lectura más pobre.
Por ejemplo:
// Given a 30-bit RGB color value as a 32-bit int
// A lot of image sensors spit out 10- or 12-bit data
// and some LVDS panels have a 10- or 12-bit format
b = (color & 0x000003ff);
g = (color & 0x000ffc00) >> 10;
r = (color & 0x3ff00000) >> 20;
// Going the other way:
color = ((r << 20) & 0x3ff00000) | ((g << 10) & 0x000ffc00) | (b & 0x000003ff);
La decodificación de las instrucciones de CPU para CPU de tipo RISC (como cuando se emula otra plataforma) requiere extraer porciones de un valor grande como se indicó anteriormente. A veces, realizar estas operaciones con multiplicación y división y módulo, etc., puede ser hasta diez veces más lento que las operaciones bit a bit equivalentes.