Bene continuiamo il discorso degli operatori con gli ultimi 2 punti in scaletta che ci mancavano ovvero:
6)operatori per la manipolazione dei bit
7)operatori di assegnamento ed espressioni
6)
Il C prevede sei operatori per la manipolazione dei bit, applicabili solo a operandi interi, ovvero quelli ti tipo char,short,int e long con o senza segno.
Essi sono:
1) & AND logico bit per bit
2) | OR logico bit per bit
3) ^ OR logico esclusiovo bit per bit
4) << scorrimento verso sinistra
5) >> scorrimento verso destra
6) ~ completamento a uno (unitario)
vediamo degli esempi:
/* FONTE DA WIKIPEDIA */
Gli 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 1 operando è vero. Funziona così:a b c=a^b
0 0 0
0 1 1
1 0 1
1 1 0
Esempi
OR
int 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
int 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
int 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
Scorrimenti:
Gli 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
Scorrimento a sinistra
int 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
int 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
#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
/* FINE PARTE PRESA DA WIKIPEDIA */
Ora vediamo una funzione che strae n bit di y a partire dalla posizione x
/*estraibits */
unsigned estraibits (unsigned y, int x,int n)
{
return (y >> (x+1-n)) & ~( ~ 0 <<n);
}
Questa funzione restituisce n bit consecutivi di n a partire dalla posizione x allineando il risultato a destra. E' un modo per fare un esempio degli operatori.
7) le espressioni in generale
Detta in breve le espressioni servono per verificare delle condizioni più o meno complesse, oppure per eseguire calcoli matematici.
Facciamo un esempio di espressione:
in matematica la scriveremo cosi:
x = x * (y + 1)
in C si potrebbe scrivere anche cosi volendo:
x *= y+ 1
e cosi via, ma vediamo un utilizzo concreto delle espressioni con la funzione contabit che conta i bit pari a 1 di y:
int contabit (unsigned y)
{
int b;
for (b = 0; y != 0; x >>= 1)
if (x & 01)
b++;
return b;
}
un altro tipo di espressione che sicuramente avrete visto in molti listati è questa:
while((x = getchar()) != EOF)
questa espressione cattura l'input fino a quando la variabile x non è piena.
C'è da parlare anche delle espressioni condizionali che pongono una condizione con le istruzioni if-else eccone un esempio:
if ( a > b)
z = a;
else
z = b;
come vedete il concetto è davvero semplice se a è maggiore di b prende la decisione che z è uguale ad a oppure z è uguale a b :).
Bene finisce qui la guida agli operatori del C :) quindi il 3 capitolo, durante la settimana pubblicherò la tabella degli operatori e le precedenza che loro hanno. (Prendetala come una appendice :))
Scrivi un commento - Vedi 0 commenti



