Barninga Z
a- a+

Gli operatori: Shift su bit

Shift su bit 

Pur essendo classificato normalmente tra i linguaggi di alto livello, il C manifesta spesso la propria natura di linguaggio orientato al sistema: gli operatori su bit di cui dispone sono una delle caratteristiche che contribuiscono a renderlo particolarmente vicino alla macchina. Tali operatori consentono di agire sui dati integral considerandoli semplici sequenze di bit. 

Particolarmente interessanti risultano due operatori che permettono di traslare, cioè di "fare scorrere" , di un certo numero di posizioni a destra o sinistra i bit di un valore: si tratta dei cosiddetti operatori di shift. In particolare, lo shift a sinistra si esprime col simbolo "<<" , mentre quello a destra (indovinate un po') con ">>". Esempio: 

a = 1;
    printf("%d
" ,a <<= 2);
    printf("%d
" ,a >> 1);

Il frammento di codice riportato produce la visualizzazione dei numeri 4 e 2; infatti, il numero 1 in forma binaria è 00000001. Traslando a sinistra i bit di due posizioni, si ottiene 00000100, che è, appunto, 4. L'operatore di assegnamento può essere composto con gli operatori su bit: ne segue che la seconda riga di codice modifica il valore di a, assegnandole il suo stesso valore traslato a sinistra di due posizioni. La seconda chiamata a printf() visualizza il valore 2, restituito dall'espressione che trasla a destra di una posizione i bit del valore presente in a (4), ma questa volta a non è modificata. 

Va osservato che l'operazione di shift rende privi di significato i primi o gli ultimi bit del valore (a seconda che la traslazione avvenga verso sinistra o, rispettivamente, verso destra)[5]: quegli spazi sono riempiti con bit di valore opportuno. Nel caso di shift a sinistra non vi è mai problema: i bit lasciati liberi sono riempiti con bit a zero; ma nel caso di uno shift a destra le cose si complicano. 

Se l'integral su cui è effettuato lo shift è senza segno, o è signed ma positivo, allora anche in questo caso sono utilizzati bit nulli come riempitivo. Se, al contrario, l'integral è di tipo signed ed è negativo, allora va tenuto presente che il suo bit più significativo, cioè quello all'estrema sinistra, è usato proprio per esprimere il segno. Alcuni processori estendono il segno, cioè riempiono i bit lasciati liberi dallo shift con bit a uno; altri invece inseriscono comunque bit nulli. Pertanto, a seconda del calcolatore su cui è eseguita, una operazione di shift a sinistra come la seguente: 

signed char sc;

    sc = -1;       // In bits e' 11111111
    sc >>= 4;      // rimane 11111111 con E.S.; 
diventa 00001111 senza E.S.

può avere quale effetto un valore finale per sc pari ancora a ­1, se il processore effettua l'estensione del segno, oppure pari a 15 se non vi è estensione di segno. Cautela, dunque: consultare la documentazione della macchina[6] prima di azzardare ipotesi. 

 



Ti potrebbe interessare anche

commenta la notizia

Ci sono 1 commenti