Operatori bitwise in C

Operatori bitwise in C
In questo Suggerimento Linux Articolo, è spiegato tutto ciò che riguarda le operazioni logiche bitwise. Usando un esempio pratico con i frammenti di codice immagine, vedremo in dettaglio ciascuno degli operatori logici utilizzati nella lingua C.

Inoltre, spiegheremo come eseguire il mascheramento dei bit con le operazioni logiche, poiché questo è qualcosa di molto utile nella programmazione ed è completamente correlato a questo tipo di operatori.

Descrizione delle operazioni bitwise

Le operazioni in bit sono logiche e le operazioni di spostamento vengono applicate individualmente a ciascun bit di una variabile. Ad esempio, se applichiamo l'operazione e tra le variabili "A" e "B", il bit 0 di "A" sarà collegato al bit 0 di "B", il bit 1 di "A" sarà collegato al bit 1 di "B" ", e così via.

Ogni bit opera e restituisce il proprio risultato e non ha alcuna influenza sul risultato dei bit adiacenti ad esso.

Questo tipo di operazione è molto utile nei bit di mascheramento quando si utilizzano flag di controllo o indicatori raggruppati in un singolo elemento di dati come un numero intero.

Come assegnare un valore binario a una variabile nella lingua C

Prima di iniziare a spiegare quali sono le operazioni logiche bitwise, diamo un'occhiata a come assegnare un valore a una variabile nel codice binario perché sebbene possiamo farlo in decimale, esadecimale o qualche altra rappresentazione, visualizzando 1s e 0s fa la programmazione molto più pratico e comprensibile. Ad esempio, nei casi in cui i bit rappresentano flag di controllo o indicatori raggruppati in una variabile INT, doppia o altra.

Per assegnare un valore a una variabile in formato binario, dobbiamo prefiggere la rappresentazione binaria con "0B". Il seguente snippet assegna il valore 131 o 0B10000011 all'intero “A” in formato binario e quindi visualizza la sua rappresentazione decimale nella console di comando.

#includere
void main ()
int a;
A = 0B10000011;
printf ("La rappresentazione decimale per 0B10000011 è: %i \ n", a);

L'immagine seguente mostra il risultato per questo codice.

Rappresentare i valori binari nelle operazioni di bit e mascheratura rende la programmazione molto più fluida e comprensibile ed evita errori o conversioni che costano tempo.

Non operatore

L'operatore logico per il non è il simbolo "~".

L'operazione logica non o negazione è la più semplice di tutte, con un solo input e un output.

Questa operazione restituisce nella sua uscita il valore binario invertito del suo input.

Considera la seguente espressione per l'operazione logica non con l'input "A"

c = ~ a

Il risultato in "c" è uguale a 1 se "a" è uguale a 0 e "c" è uguale a 0 se "a" è uguale a 1. Questa operazione è comunemente utilizzata per ottenere il valore complementare di una variabile.

Successivamente, guardiamo il tavolo della verità per l'operazione non.

UN ~ = C
0 ~ = 1
1 ~ = 0

Esempio:

In questo esempio, applicheremo l'operazione non alla variabile A per ottenere il suo complemento in "C"

Per fare ciò, creiamo la variabile A di tipo non firmato, gli assegniamo il valore 131 e otteniamo il risultato in "C". Quindi utilizziamo la funzione printf () per visualizzare il risultato nella console di comando. Di seguito, possiamo vedere il codice a questo scopo.

#includere
void main ()

Char C;
Char a non firmato A;
A = 0B01111100;
c = ~ a;
printf ("\ nthe Decimal Rappresentation per 0B10000011 è: %i \ n", c);

Nella figura seguente, vediamo il risultato del complemento di "A" . In questo caso, il complemento o l'inverso di 131 è 124 o 0111100 in rappresentanza binaria.


Logico e operatore

L'operatore logico per l'operazione e è il simbolo "&"

Vediamo la seguente espressione per la logica e il funzionamento tra le variabili A e B

c = a & b.

Il risultato in "C" è uguale a 1 solo se "A" e "B" sono uguali a 1. In tutti gli altri casi, "C" è uguale a 0.

Successivamente, guardiamo il tavolo della verità per l'operazione e.

UN E B = C
0 E 0 = 0
0 E 1 = 0
1 E 0 = 0
1 E 1 = 1

L'operazione logica ed è molto utile nel mascheramento dei bit. Più tardi vedremo una sezione che spiega questa tecnica in modo più dettagliato.

Esempio:

Ora, vediamo un esempio in cui eseguiamo il logico e il funzionamento tra le variabili "A" e "B" di tipo non firmato e memorizzare il risultato in "C" per visualizzarlo in seguito nella console di comando.

Assegniamo il valore 135 o 10000111 alla variabile “A” e 129 o 1000001 alla variabile “B” nella rappresentazione binaria. Quindi, useremo l'operatore "&" "per eseguire l'operazione. Successivamente, vedremo il codice per questo.

#includere
void main ()

char non firmato a = 0B10000111;
CHAR BARE B = 0B10000001;
Char C;
c = a & b;
printf ("\ n il risultato di a & b è: %i \ n", c);

L'immagine mostra il risultato di questo codice in cui l'operazione e tra "A" e "B" provoca 129 o 10000001 in binario.

Logico o operatore

L'operatore logico per l'operazione o è il simbolo ”| ".

Vediamo la seguente espressione per l'operazione logica o tra le variabili A e B

c = a | B.

Il risultato in "C" sarà uguale a 1 solo se "A" o "B" o "A" e "B" è uguale a 1, mentre sarà uguale a 0 solo se "A" e "B" sono entrambi uguali.

Successivamente, guardiamo il tavolo della verità per l'operazione o.

A | B = C
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Esempio

In questo esempio vedremo come eseguire l'operazione logica o tra le variabili "A" e "B" di tipo non firmato e memorizzare il risultato in "C" per visualizzarlo in seguito nella console di comando.

Assegniamo il valore 128 o 10000000 alla variabile “A” e 3 o 00000011 alla variabile “B” nella rappresentazione binaria. Quindi, useremo l'operatore "|" per eseguire l'operazione. Successivamente, vedremo il codice per questa operazione.

#includere
void main ()

char non firmato A = 0B10000000;
Carre non firmato B = 0B00000011;
Char C;
c = a | B;
printf ("\ n il risultato di a | b è: %i \ n", c);

Nell'immagine seguente, vediamo il risultato dell'operazione C = A | b che in questo caso è 131 o 10000011 in binario.

Operatore logico XOR o esclusivo o

L'operatore logico per l'operazione XOR è il simbolo " ^".

Vediamo la seguente espressione per l'operazione logica XOR tra le variabili A e B

c = a ^ b.

Il risultato in "C" è uguale a 1 solo se uno dei bit "A" o "B" è uguale a 1, ma è 0 se "A" e "B" sono entrambi uguali a 1 o uguali a 0.

Questa operazione è essenziale negli additivi perché nel sistema binario 1 + 0 = 1 o 0 + 1 è anche uguale a 1. Ma 1 + 1 = 0 con carry al bit successivo. In questo caso, il trasporto viene eseguito dall'operazione e.

Successivamente, guardiamo il tavolo della verità per l'operazione XOR.

UN ^ B = C
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Esempio

Ora, guardiamo un esempio in cui eseguiamo l'operazione logica XOR tra le variabili "A" e "B" di tipo non firmato e memorizziamo il risultato in "C" per visualizzarlo più tardi nella console di comando.

Assegniamo il valore 135 o 10000111 alla variabile “A” e 3 o 00000011 alla variabile “B” nella notazione binaria. Quindi, useremo l'operatore " ^" per eseguire l'operazione logica. Successivamente, vedremo il codice per questo.

#includere
void main ()

char non firmato a = 0B10000111;
Carre non firmato B = 0B00000011;
Char C;
c = a ^ b;
printf ("\ n il risultato di a | b è: %i \ n", c);

Come possiamo vedere nell'immagine, il risultato è 10000100 e i bit i cui due ingressi sono = 1 xor risulta in 0.

Operatori con assegnazione

Gli operatori con assegnazione eseguono le stesse operazioni logiche che abbiamo visto prima, ma il loro risultato è memorizzato nell'operando che precede l'operatore.

La seguente espressione esegue la logica e il funzionamento tra la variabile "A" e la variabile o il valore assegnato dopo l'operatore e il risultato viene restituito in "A".

a & = 55;

Operatori di rotazione

Gli operatori di rotazione sono "< > ".

Questi operatori spostano i dati di una variabile per bit "n" a sinistra o a destra, rispettivamente.

Nella seguente espressione, l'operatore sposta i dati memorizzati in "A" 5 bit a sinistra.

a = a < < 5

Esempio

In questo esempio, assegneremo il valore 0B000001 alla variabile "A" e quindi sposteremo 1 bit a sinistra in un ciclo per loop e output il valore risultante nella console di comando. Questo ciclo si ripete 8 volte

#includere
void main ()

char non firmato a = 0b00000001;
Char C;
per (int bit = 0; bit!= 8; bit ++)
printf ("%i \ n", a);
a = a<<1;

Nella seguente immagine, vediamo il risultato con i valori decimali corrispondenti a ciascuna posizione dei bit in un carattere non firmato.

Mascheria un po '

In alcuni casi, come quando definiamo più flag di controllo raggruppate in un singolo registro, dobbiamo solo conoscere o modificare il valore di uno o più bit, non l'intero registro.

Per ottenere lo stato di uno o più bit specifici, dobbiamo definire una maschera che imposta solo i bit degli elementi il ​​cui valore vogliamo conoscere a 1 e applicare l'operazione e l'operazione.

Ad esempio, se vogliamo ottenere il valore dei bit 0 e 2 di variabile "A", dobbiamo definire la seguente maschera ed eseguire il funzionamento e l'operazione.

00000101

In questo caso, solo lo stato dei bit 0 e 2 verrà restituito di conseguenza, i bit rimanenti avranno il valore = 0, indipendentemente dal valore che hanno "A".

Per modificare il valore, dobbiamo applicare l'operazione o tra la maschera con i bit che vogliamo impostare su 1 e la variabile che vogliamo cambiare. Se vogliamo impostarlo su 0, dobbiamo invertire la maschera come mostrato di seguito e applicare l'operazione e l'operazione.

11111010

Esempio

In questo esempio, usiamo il mascheramento dei bit per creare un convertitore semplice e pratico dai numeri decimali a una stringa con la sua rappresentazione binaria.

Per questa conversazione useremo 8 maschere, una per ogni bit, ma per rendere la programmazione più pratica e più chiara, useremo prima la maschera 10000000 e quindi sposteremo un bit a destra in ogni ciclo del ciclo. In questo modo, otterremo le seguenti 8 maschere di cui abbiamo bisogno.

10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

Il convertitore è costituito da un ciclo per 8 cicli, in ognuno dei quali interroga lo stato del bit corrispondente. Questo viene fatto da A e operazione tra i dati da convertire e la maschera corrispondente.

Se il risultato dell'operazione in "C" è 0, output questo valore con la funzione printf (). Altrimenti, se il valore del bit è 1, verrà stampato nella console di comando.

Di seguito è riportato il codice per questo comodo convertitore.

#includere
void main ()
char non firmato a = 143;
CHAR BARE B = 0B10000000;
Char C;
printf ("\ n la rappresentazione binaria di a è:");
per (int bit = 0; bit!= 8; bit ++)
c = a & b;
if (c == 0)
printf ("0");
altro
printf ("1");
B = B >> 1;
c = 0;

printf ("\ n \ n");

Nella seguente immagine, vediamo sotto il risultato della conversione per il numero 143.

Conclusione

In questo Suggerimento Linux Articolo, abbiamo spiegato ciascuno degli operatori logici e di rotazione che la lingua C fornisce per l'elaborazione bitwise. Per ciascuno di questi operatori, abbiamo creato una sezione che mostra il simbolo utilizzato per quella descrizione dell'operatore e un esempio pratico con frammenti di codice e immagini per ciascuno. Abbiamo anche incluso una sezione che si occupa di mascheramento dei bit e di ciò che è un'aggiunta, che è completamente correlata alle operazioni logiche di questo tipo.