Acho que a segunda parte da pergunta:
Além disso, para que os operadores bit a bit são realmente usados? Eu gostaria de alguns exemplos.
Foi abordado apenas parcialmente. Esses são meus dois centavos nesse assunto.
As operações bit a bit em linguagens de programação desempenham um papel fundamental ao lidar com muitos aplicativos. Quase toda a computação de baixo nível deve ser feita usando esse tipo de operação.
Em todos os aplicativos que precisam enviar dados entre dois nós, como:
Na camada de comunicação de nível inferior, os dados geralmente são enviados no que chamamos de quadros . Os frames são apenas strings de bytes enviados por meio de um canal físico. Esses quadros geralmente contêm os dados reais mais alguns outros campos (codificados em bytes) que fazem parte do que é chamado de cabeçalho . O cabeçalho geralmente contém bytes que codificam algumas informações relacionadas ao status da comunicação (por exemplo, com sinalizadores (bits)), contadores de quadros, códigos de correção e detecção de erros, etc. Para obter os dados transmitidos em um quadro e construir o quadros para enviar dados, você precisará de operações bit a bit certas.
Em geral, ao lidar com esse tipo de aplicativo, uma API está disponível para que você não precise lidar com todos esses detalhes. Por exemplo, todas as linguagens de programação modernas fornecem bibliotecas para conexões de soquete, portanto, você não precisa realmente construir os quadros de comunicação TCP / IP. Mas pense nas boas pessoas que programaram essas APIs para você, elas tiveram que lidar com a construção de quadros com certeza; usando todos os tipos de operações bit a bit para ir e voltar da comunicação de nível inferior para a de nível superior.
Como um exemplo concreto, imagine que alguém lhe dê um arquivo que contém dados brutos que foram capturados diretamente pelo hardware de telecomunicações. Neste caso, para encontrar os quadros, você precisará ler os bytes brutos do arquivo e tentar encontrar algum tipo de palavra de sincronização, escaneando os dados bit a bit. Depois de identificar as palavras de sincronização, você precisará obter os quadros reais e SHIFT- los se necessário (e isso é apenas o início da história) para obter os dados reais que estão sendo transmitidos.
Outra família de aplicativos de baixo nível muito diferente é quando você precisa controlar o hardware usando algumas portas (tipo antigas), como portas paralelas e seriais. Essas portas são controladas configurando alguns bytes, e cada bit desses bytes tem um significado específico, em termos de instruções, para aquela porta (ver por exemplo http://en.wikipedia.org/wiki/Parallel_port ). Se você quiser construir um software que faça algo com esse hardware, você precisará de operações bit a bit para traduzir as instruções que deseja executar para os bytes que a porta entende.
Por exemplo, se você tiver alguns botões físicos conectados à porta paralela para controlar algum outro dispositivo, esta é uma linha de código que você pode encontrar no aplicativo soft:
read = ((read ^ 0x80) >> 4) & 0x0f;
Espero que isso contribua.