bitwise Operatori in C: AND, OR, XOR, Shift & Complemento

⚡ Riepilogo intelligente

Gli operatori bit a bit in C manipolano i dati a livello di singolo bit, utilizzando operazioni AND, OR, XOR, complemento e shift su operandi interi per eseguire calcoli più veloci, gestire flag di impacchettamento e controllare l'hardware nella programmazione di basso livello e nei sistemi embedded.

  • 🧮 Operatori: Sei operatori — AND (&), OR (|), XOR (^), complemento (~), shift a sinistra (<<), shift a destra (>>) — agiscono bit per bit.
  • 🔗 E OPPURE: Il risultato dell'operatore & è 1 solo quando entrambi i bit sono 1; il risultato dell'operatore | è 1 quando almeno uno dei due bit è 1.
  • 🔀 XOR: Il risultato ^ è 1 quando esattamente un bit è 1, utile per commutare i bit e scambiarliping valori.
  • ↔️ Shifts: Gli operatori << e >> spostano i bit a sinistra o a destra, moltiplicando o dividendo per potenze di due.
  • 🔁 Complemento: L'operatore ~ ​​inverte tutti i bit, quindi 0000 1111 diventa 1111 0000.
  • 🤖 Aiuto tramite intelligenza artificiale: Gli assistenti basati sull'IA e GitHub Copilot generano e spiegano rapidamente le maschere di bit e la logica di shift.

bitwise Operatori in C

Cosa sono i bitwise Operatori?

bitwise OperaGli operatori bit a bit vengono utilizzati per manipolare i dati a livello di bit, anche detta programmazione a livello di bit. Gli operatori bit a bit operano su uno o più pattern di bit o numeri binari a livello dei singoli bit. Vengono utilizzati nei calcoli numerici per velocizzare il processo di calcolo.

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 una cosa: gli operatori bit a bit sono utilizzati principalmente con tipo di dati intero grazie alla 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 scorrimento bit a bit vengono utilizzati per spostare le sequenze di bit a sinistra o a destra. Gli operatori di scorrimento a sinistra e a destra sono due operatori forniti dal linguaggio 'C' e 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

ShiftGli operatori s possono essere combinati quindi può essere utilizzato per esprimeretract i dati dall'espressione intera. Scriviamo un programma per dimostrare l'uso degli operatori di scorrimento 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 operatori 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

DOMANDE FREQUENTI

L'operazione AND bit a bit (&) agisce sui singoli bit e restituisce un numero intero, mentre l'operazione AND logica (&&) verifica intere espressioni e restituisce un singolo valore booleano, vero o falso.

Shift 1 per creare una maschera: imposta con il valore | (1 << n), cancella con il valore & ~(1 << n) e attiva/disattiva con il valore ^ (1 << n).

Uno shift a sinistra di n moltiplica un valore senza segno per 2 elevato a n; uno shift a destra lo divide, quindi i compilatori usano gli shift per velocizzare le operazioni.

Controlla il numero e 1. Il bit meno significativo restituisce 1 per i valori dispari e 0 per i valori pari, più velocemente dell'operatore modulo.

Il firmware integrato, i driver, la crittografia, la compressione, la grafica e le reti li utilizzano per impacchettare i flag, leggere i registri hardware, creare maschere di autorizzazione e velocizzare le operazioni aritmetiche.

Shift Gli operatori creano legami più forti rispetto a quelli relazionali, mentre &, ^ e | si trovano al di sotto dell'uguaglianza ma al di sopra degli operatori logici && e ||, quindi è meglio racchiuderli tra parentesi per sicurezza.

Sì. Un assistente di programmazione basato sull'IA scrive maschere e shift a partire da un prompt, spiega i complementi negativi e trasforma esempi binari in codice C funzionante. Testa sempre il risultato.

Copilota GitHub suggerisce macro per maschere di bit, funzioni di supporto per impostare e azzerare i bit e operazioni di shift da un commento; rivedi i suoi completamenti rispetto alla disposizione dei bit.

Riassumi questo post con: