Creo que la segunda parte de la pregunta:
Además, ¿para qué se utilizan realmente los operadores bit a bit? Agradecería algunos ejemplos.
Solo se ha abordado parcialmente. Estos son mis dos centavos al respecto.
Las operaciones bit a bit en lenguajes de programación juegan un papel fundamental cuando se trata de una gran cantidad de aplicaciones. Casi toda la computación de bajo nivel debe realizarse utilizando este tipo de operaciones.
En todas las aplicaciones que necesitan enviar datos entre dos nodos, como:
En la capa de comunicación de nivel inferior, los datos generalmente se envían en lo que se denomina tramas . Las tramas son solo cadenas de bytes que se envían a través de un canal físico. Estos marcos generalmente contienen los datos reales más algunos otros campos (codificados en bytes) que son parte de lo que se llama encabezado . El encabezado generalmente contiene bytes que codifican alguna información relacionada con el estado de la comunicación (por ejemplo, con banderas (bits)), contadores de tramas, códigos de corrección y detección de errores, etc. Para obtener los datos transmitidos en una trama y construir marcos para enviar datos, necesitará operaciones seguras a nivel de bits.
En general, cuando se trata de ese tipo de aplicaciones, hay una API disponible para que no tenga que ocuparse de todos esos detalles. Por ejemplo, todos los lenguajes de programación modernos proporcionan bibliotecas para conexiones de socket, por lo que en realidad no necesita construir los marcos de comunicación TCP / IP. Pero piense en las buenas personas que programaron esas API para usted, seguro que tuvieron que lidiar con la construcción de marcos; utilizando todo tipo de operaciones bit a bit para ir y venir de la comunicación de bajo nivel a la de nivel superior.
Como ejemplo concreto, imagine que alguien le da un archivo que contiene datos sin procesar que fueron capturados directamente por hardware de telecomunicaciones. En este caso, para encontrar los fotogramas, deberá leer los bytes sin procesar en el archivo e intentar encontrar algún tipo de palabras de sincronización, escaneando los datos bit a bit. Después de identificar las palabras de sincronización, necesitará obtener los fotogramas reales y CAMBIARlos si es necesario (y ese es solo el comienzo de la historia) para obtener los datos reales que se están transmitiendo.
Otra familia de aplicaciones de bajo nivel muy diferente es cuando necesita controlar el hardware usando algún tipo de puertos (antiguos), como puertos paralelos y seriales. Estos puertos se controlan estableciendo algunos bytes, y cada bit de esos bytes tiene un significado específico, en términos de instrucciones, para ese puerto (consulte, por ejemplo, http://en.wikipedia.org/wiki/Parallel_port ). Si desea crear software que haga algo con ese hardware, necesitará operaciones bit a bit para traducir las instrucciones que desea ejecutar a los bytes que el puerto comprende.
Por ejemplo, si tiene algunos botones físicos conectados al puerto paralelo para controlar algún otro dispositivo, esta es una línea de código que puede encontrar en la aplicación software:
read = ((read ^ 0x80) >> 4) & 0x0f;
Espero que esto contribuya.