Penso che la seconda parte della domanda:
Inoltre, a cosa servono effettivamente gli operatori bit per bit? Apprezzerei alcuni esempi.
È stato affrontato solo parzialmente. Questi sono i miei due centesimi su quella materia.
Le operazioni bit per bit nei linguaggi di programmazione giocano un ruolo fondamentale quando si tratta di molte applicazioni. Quasi tutto il calcolo di basso livello deve essere eseguito utilizzando questo tipo di operazioni.
In tutte le applicazioni che devono inviare dati tra due nodi, come ad esempio:
Nel livello di comunicazione di livello inferiore, i dati vengono solitamente inviati in quelli che vengono chiamati frame . I frame sono solo stringhe di byte che vengono inviate attraverso un canale fisico. Questi frame di solito contengono i dati effettivi più alcuni altri campi (codificati in byte) che fanno parte di ciò che viene chiamato intestazione . L'intestazione di solito contiene byte che codificano alcune informazioni relative allo stato della comunicazione (ad esempio, con flag (bit)), contatori di frame, codici di correzione e rilevamento degli errori, ecc. Per ottenere i dati trasmessi in un frame e per costruire il frame per inviare dati, avrai bisogno di certe operazioni bit per bit.
In generale, quando si ha a che fare con quel tipo di applicazioni, è disponibile un'API in modo da non dover gestire tutti quei dettagli. Ad esempio, tutti i linguaggi di programmazione moderni forniscono librerie per le connessioni socket, quindi non è effettivamente necessario creare i frame di comunicazione TCP / IP. Ma pensa alle brave persone che hanno programmato quelle API per te, hanno dovuto sicuramente occuparsi della costruzione del telaio; utilizzando tutti i tipi di operazioni bit per bit per andare avanti e indietro dalla comunicazione di basso livello a quella di livello superiore.
Come esempio concreto, immagina che qualcuno ti dia un file che contiene dati grezzi che sono stati catturati direttamente dall'hardware di telecomunicazione. In questo caso, per trovare i frame, sarà necessario leggere i byte grezzi nel file e provare a trovare un qualche tipo di parole di sincronizzazione, scansionando i dati bit per bit. Dopo aver identificato le parole di sincronizzazione, sarà necessario per ottenere i fotogrammi effettivi, e SHIFT loro se necessario (e che è solo l'inizio della storia) per ottenere i dati effettivi che viene trasmesso.
Un'altra famiglia di applicazioni di basso livello molto diversa è quando è necessario controllare l'hardware utilizzando alcune porte (un po 'antiche), come porte parallele e seriali. Queste porte sono controllate impostando alcuni byte, e ogni bit di quei byte ha un significato specifico, in termini di istruzioni, per quella porta (vedere ad esempio http://en.wikipedia.org/wiki/Parallel_port ). Se vuoi creare software che faccia qualcosa con quell'hardware avrai bisogno di operazioni bit per bit per tradurre le istruzioni che vuoi eseguire nei byte che la porta comprende.
Ad esempio, se hai alcuni pulsanti fisici collegati alla porta parallela per controllare qualche altro dispositivo, questa è una riga di codice che puoi trovare nell'applicazione software:
read = ((read ^ 0x80) >> 4) & 0x0f;
Spero che questo contribuisca.