C/Variabili, operatori e costanti/Operatori sui bit
Il C è fornito di molti operatori sui bit. Queste operazioni possono essere eseguite solo sui tipi int
e char
, incluse le varianti ottenute con i modificatori long
, short
, signed
e unsigned
.
Ecco gli operatori:
AND, OR e XOR
modificaGli operatori OR e AND hanno lo stesso funzionamento degli operatori logici, la differenza è che questi operano sui bit.
È stato aggiunto l'operatore XOR (OR esclusivo), che restituisce vero se solo un operando è vero. Funziona così:
a | b | c=a^b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Esempi
modificaOR
modificaint a=147;
int b=97;
int c=a|b; //OR
printf("c è uguale a %d", c);
Il risultato sarà: c è uguale a 243
, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 |
AND
modificaint a=147;
int b=97;
int c=a&b; //AND
printf("c è uguale a %d", c);
Il risultato sarà: c è uguale a 1
, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
XOR
modificaint a=147;
int b=97;
int c=a^b; //XOR
printf("c è uguale a %d", c);
Il risultato sarà: c è uguale a 242
, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
Scorrimento a destra, a sinistra e complemento a uno
modificaGli operatori di scorrimento a destra e a sinistra fanno scorrere i bit della variabile specificata come primo operando verso destra o verso sinistra per il numero di volte specificato dal secondo operando. I bit fuoriusciti non rientreranno dall'altra estremità, ma andranno persi.
Il complemento a uno, invece, ha un funzionamento molto semplice. Esso inverte i bit, ovvero trasforma gli 1 in 0 e gli 0 in 1.
Esempi
modificaScorrimento a sinistra
modificaint a=42;
int c=a<<1; //Scorrimento a sinistra
printf("c è uguale a %d", c);
Il risultato sarà: c è uguale a 84
, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
Scorrimento a destra
modificaint a=42;
int c=a>>1; //Scorrimento a destra
printf("c è uguale a %d", c);
Il risultato sarà: c è uguale a 21
, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
Complemento a uno (o calcolo del valore negativo in base 2)
modifica#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned char i=10;
unsigned char j =~i;
printf("%u", j);
}
Il risultato sarà 245, perché:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |