bitwise Operatori in C: AND, OR, XOR, Shift & Complemento
Cosa sono i bitwise Operatori?
bitwise OperaTors sono usati per manipolare dati a livello di bit, anche detta programmazione a livello di bit. Bitwise opera su uno o più pattern di bit o numeri binari a livello dei loro singoli bit. Sono usati nei calcoli numerici per rendere il processo di calcolo più veloce.
Di seguito è riportato l'elenco degli operatori bit a bit forniti dal linguaggio di programmazione 'C':
Operator | Significato |
---|---|
& | Operatore AND bit a bit |
| | Operatore OR bit a bit |
^ | Operatore OR esclusivo bit a bit |
~ | Complemento binario a uno Operator è un operatore unario |
<< | Operatore di turno a sinistra |
>> | Operatore di spostamento a destra |
Gli operatori bit a bit non possono essere applicati direttamente ai tipi di dati primitivi come float, double, ecc. Ricorda sempre che gli operatori bit a bit sono usati principalmente con il tipo di dati intero per via della sua compatibilità.
Gli operatori logici bit a bit agiscono sui dati bit per bit, partendo dal bit meno significativo, ovvero il bit LSB che è il bit più a destra, fino al bit MSB (Most Significant Bit) che è il bit più a sinistra.
Il risultato del calcolo degli operatori logici bit a bit è mostrato nella tabella seguente.
x | y | x & y | x | sì | x^y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
AND bit a bit
Questo è uno degli operatori logici bitwise più comunemente usati. È rappresentato da un singolo segno di e commerciale (&). Due espressioni intere sono scritte su ogni lato dell'operatore (&).
Il risultato dell'operazione AND bit a bit è 1 se entrambi i bit hanno valore 1; in caso contrario, il risultato è sempre 0.
Consideriamo di avere 2 variabili op1 e op2 con valori come segue:
Op1 = 0000 1101 Op2 = 0001 1001
Il risultato dell'operazione AND sulle variabili op1 e op2 sarà
Result = 0000 1001
Come possiamo vedere, due variabili vengono confrontate poco a poco. Ogni volta che il valore di un bit in entrambe le variabili è 1, il risultato sarà 1 oppure 0.
OR bit per bit
È rappresentato da un singolo segno di barra verticale (|). Due espressioni intere vengono scritte su ciascun lato dell'operatore (|).
Il risultato dell'operazione OR bit a bit è 1 se almeno una delle espressioni ha valore 1; in caso contrario, il risultato è sempre 0.
Consideriamo di avere 2 variabili op1 e op2 con valori come segue:
Op1 = 0000 1101 Op2 = 0001 1001
Il risultato dell'operazione OR sulle variabili op1 e op2 sarà
Result = 0001 1101
Come possiamo vedere, due variabili vengono confrontate poco a poco. Ogni volta che il valore di un bit in una delle variabili è 1, il risultato sarà 1 oppure 0.
OR esclusivo bit a bit
È rappresentato da un simbolo (^). Due espressioni intere vengono scritte su ciascun lato dell'operatore (^).
Il risultato dell'operazione OR esclusivo bit a bit è 1 se solo una delle espressioni ha valore 1; in caso contrario, il risultato è sempre 0.
Consideriamo di avere 2 variabili op1 e op2 con valori come segue:
Op1 = 0000 1101 Op2 = 0001 1001
Il risultato dell'operazione XOR sulle variabili op1 e op2 sarà
Result = 0001 0100
Come possiamo vedere, due variabili vengono confrontate poco a poco. Ogni volta che solo una variabile contiene il valore 1, il risultato è 0, altrimenti 0 sarà il risultato.
Scriviamo un semplice programma che dimostri gli operatori logici bit a bit.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
Produzione:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Operatori di spostamento bit a bit
Gli operatori di spostamento bit a bit vengono utilizzati per spostare/spostare i pattern di bit verso sinistra o verso destra. Sinistra e destra sono due operatori di spostamento forniti da 'C' che sono rappresentati come segue:
Operand << n (Left Shift) Operand >> n (Right Shift)
Qui,
- un operando è un'espressione intera sulla quale dobbiamo effettuare l'operazione di shift.
- 'n' è il numero totale di posizioni di bit che dobbiamo spostare nell'espressione intera.
L'operazione di spostamento a sinistra sposterà il numero 'n' di bit sul lato sinistro. I bit più a sinistra nell'espressione verranno eliminati e n bit con il valore 0 verranno riempiti sul lato destro.
L'operazione di spostamento a destra sposterà il numero 'n' di bit sul lato destro. I bit 'n' più a destra nell'espressione verranno eliminati e il valore 0 verrà riempito sul lato sinistro.
Esempio: x è un'espressione intera con dati 1111. Dopo aver eseguito l'operazione di spostamento il risultato sarà:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
Shifts operatori possono essere combinati, quindi possono essere utilizzati per estrarre i dati dall'espressione intera. Scriviamo un programma per dimostrare l'uso degli operatori di spostamento bit a bit.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
Produzione:
Left shift - Value of c is 80 Right shift - Value of c is 5
Dopo aver eseguito l'operazione di spostamento a sinistra il valore diventerà 80 il cui equivalente binario è 101000.
Dopo aver eseguito l'operazione di spostamento a destra, il valore diventerà 5 il cui equivalente binario è 000101.
Operatore di complemento bit a bit
Il complemento bit a bit è anche chiamato operatore di complemento a uno poiché accetta sempre solo un valore o un operando. È un operatore unario.
Quando eseguiamo il complemento su qualsiasi bit, tutti gli 1 diventano 0 e viceversa.
Se abbiamo un'espressione intera che contiene 0000 1111, dopo aver eseguito l'operazione di complemento bit a bit il valore diventerà 1111 0000.
L'operatore di complemento bit a bit è indicato dal simbolo tilde (~).
Scriviamo un programma che dimostra l'implementazione dell'operatore di complemento bit a bit.
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
Produzione:
Complement - Value of c is -11
Ecco un altro programma, con un esempio di tutti gli operati discussi finora:
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-49 = 11001111 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
Dopo aver compilato ed eseguito il programma, viene prodotto il seguente risultato:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
Sintesi
- Gli operatori bit a bit sono un set di operatori speciali fornito da 'C'.
- Sono utilizzati nella programmazione a livello di bit.
- Questi operatori vengono utilizzati per manipolare i bit di un'espressione intera.
- Operatori logici, di spostamento e di complemento sono tre tipi di operatori bit a bit.
- L'operatore di complemento bit a bit viene utilizzato per invertire i bit di un'espressione.