Quali sono i vantaggi dell'utilizzo di operazioni bit a bit? [chiuso]

18

Dopo aver letto la newsletter di CodeProject, mi sono imbattuto in questo articolo su operazioni bit a bit . È una lettura interessante, e posso certamente vedere il vantaggio di verificare se un intero è pari o dispari, ma testare se il bit n-esimo è impostato? Quali possono essere i vantaggi di questo?

    
posta billy.bob 22.10.2010 - 11:51
fonte

6 risposte

25

Le operazioni bit a bit sono assolutamente essenziali quando si programmano i registri hardware nei sistemi incorporati. Ad esempio, ogni processore che abbia mai usato ha uno o più registri (di solito uno specifico indirizzo di memoria) che controllano se un interrupt è abilitato o disabilitato. Per consentire a un interrupt di attivare il solito processo, è necessario impostare il bit di abilitazione per quel tipo di interrupt mentre, soprattutto, non modificare nessuno degli altri bit nel registro.

Quando si attiva un interrupt, in genere imposta un bit in un registro di stato in modo che una singola routine di servizio possa determinare il motivo preciso dell'interrupt. Il test dei singoli bit consente una decodifica rapida della sorgente di interruzione.

In molti sistemi embedded la RAM totale disponibile può essere 64, 128 o 256 BYTES (ovvero byte non kilobyte o megabyte) In questo ambiente è comune utilizzare un byte per memorizzare più voci di dati, flag booleani ecc. e quindi usa le operazioni bit per impostarle e leggerle.

Ho, per un certo numero di anni, lavorato con un sistema di comunicazione satellitare in cui il carico utile del messaggio è 10,5 byte. Per sfruttare al meglio questo pacchetto di dati, le informazioni devono essere inserite nel blocco dati senza lasciare alcun bit inutilizzato tra i campi. Ciò significa fare ampio uso degli operatori bitwise e shift per prendere i valori delle informazioni e comprimerli nel payload che viene trasmesso.

    
risposta data 22.10.2010 - 12:32
fonte
5

Fondamentalmente, li usi a causa delle dimensioni e delle considerazioni sulla velocità. Le operazioni bit a bit sono incredibilmente semplici e quindi di solito più veloci delle operazioni aritmetiche. Ad esempio, per ottenere la parte verde di un valore rgb, l'approccio aritmetico è (rgb / 256) % 256 . Con operazioni bit a bit, dovresti fare qualcosa come (rgb >> 8) & 0xFF . Quest'ultimo è significativamente più veloce e una volta che ci si abitua, è anche più facile. In genere le operazioni bit a bit entrano in gioco molto quando è necessario codificare / decodificare i dati in modo compatto e veloce.

    
risposta data 22.10.2010 - 13:26
fonte
3

Questo tipo di operazioni vengono spesso utilizzate durante la scrittura di sistemi incorporati in cui la memoria o la potenza della CPU sono limitate.

Ad esempio, per risparmiare spazio è possibile memorizzare più variabili in una singola variabile int 8 bit utilizzando ciascun bit per rappresentare un valore booleano. Allora hai bisogno di un modo veloce per impostare un bit specifico o recuperare il valore del bit.

Generalmente durante la programmazione in linguaggi di livello superiore come C # su un PC desktop con gigabyte di memoria, non ti interessa davvero che ogni bool accetta un intero byte . Ma se stai programmando un microcontrollore in C con 2kb di memoria, ogni singolo bit conta, quindi la possibilità di impacchettare 8 bool in un singolo byte può essere fondamentale.

    
risposta data 22.10.2010 - 12:15
fonte
2

Le operazioni bit a bit vengono anche utilizzate di frequente nei codec video e audio, per lo stesso motivo dell'elettronica incorporata; essere in grado di impacchettare cinque flag e un timer a undici bit in mezzo un int è molto utile quando si desidera creare un codec video super efficiente.

In effetti, MPEG 4 utilizza anche la codifica di Golomb esponenziale per i campi a lunghezza variabile. Un valore che è stato l'ultimo pacchetto da 17 o 19 bit potrebbe essere solo tre o cinque bit di larghezza in questo pacchetto, e tutto ciò con le operazioni bit a bit è possibile.

    
risposta data 15.11.2011 - 19:26
fonte
1

I trucchi che combinano operazioni logiche bit a bit, operazioni di spostamento bit a bit e operazioni aritmetiche possono essere capiti da persone che hanno studiato la costruzione di un sommatore binario utilizzando porte logiche (e, o, non). Al di fuori di quel cerchio, è molto difficile capire senza un commento dettagliato.

È utile quando si programmano unità SIMD , specialmente se l'architettura della CPU lascia intenzionalmente alcune istruzioni SIMD perché potrebbero essere emulato da pochi altri.

Ad esempio, l'architettura non può definire alcuna istruzione per prendere i valori negativi di un gruppo di 16 byte, ma ciò può essere emulato mediante la negazione bit a bit e quindi l'aggiunta 1. Analogamente, la sottrazione può anche essere omessa, perché può essere emulato prendendo il negativo del secondo operando. La disponibilità del "percorso alternativo" è il motivo dell'omissione di alcune istruzioni.

Allo stesso modo, il SIMD può supportare solo l'aggiunta parallela a 8 bit, senza implementare l'aggiunta per elementi più ampi come 16-bit, 32-bit o 64-bit. Per emularli, è necessario estrarre il bit del segno dal risultato del calcolo a 8 bit, quindi eseguire l'operazione carry sull'elemento successivo.

    
risposta data 24.10.2010 - 11:38
fonte
-1

Dati di imballaggio, operazioni più veloci (moltiplicazione, divisione e modulo sono significativamente più veloci se allineati alle potenze di 2), bit flipping, ecc. Imparali e inizia a usarli e inizierai lentamente a vedere la maggior parte dei vantaggi su il tuo.

    
risposta data 12.11.2013 - 07:14
fonte

Leggi altre domande sui tag