Porque são operações fundamentais.
Pela mesma linha de pensamento, você poderia argumentar que a adição tem poucos usos no mundo real, pois pode ser substituída completamente por subtração (e negação) e multiplicação. Mas mantemos a adição porque é uma operação fundamental.
E não pense por um momento que só porque você não viu muita necessidade de operações bit a bit não significa que elas não sejam usadas com muita frequência. Na verdade, eu usei operações bit a bit em quase todos os idiomas que usei para coisas como mascaramento de bits.
Em primeiro lugar, usei operações bit a bit para processamento de imagem, campos de bits e sinalizadores, processamento de texto (por exemplo, todos os caracteres de uma classe específica geralmente compartilham um padrão de bits comum), codificando e decodificando dados serializados, decodificando VM ou CPU códigos de operação e assim por diante. Sem operações bit a bit, a maioria dessas tarefas exigiria operações muitas vezes mais complexas para executar a tarefa com menos confiabilidade ou com menor legibilidade.
Por exemplo:
// 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);
A decodificação de instruções da CPU para CPUs do tipo RISC (como ao emular outra plataforma) requer a extração de partes de um valor grande, como acima. Às vezes, fazer essas operações com multiplicação, divisão, módulo, etc., pode ser até dez vezes mais lento que o equivalente em operações bit a bit.