Sostituire gli operatori logici di spostamento dei bit con semplici operazioni

Da Gambas-it.org - Wikipedia.

Come è noto, nel linguaggio C fra gli operatori cosiddetti bitwise, ossia quegli operatori capaci di operare sui singoli bit, vi sono anche gli operatori di spostamento (shift) dei bit, che effettuano un spostamento a sinistra di un bit:

<<

oppure uno spostamento a destra:

>>

Lo spostamento del bit interessato avviene di un numero di posizioni uguale al valore del secondo operando.

Così, ad esempio:

16 << 2

sposta a sinistra di 2 posizioni i bit del valore di 16, e riempie di zeri i bit così liberati.


Lo spostamento in Gambas

In Gambas, come si sa, esistono alcune funzioni specifiche per effettuare lo spostamento dei bit a sinistra.
Due che salvaguardano il "segno" del valore gestito:

Shl(valore, spostamento)

o a destra:

Shr(valore, spostamento)

e due che ignorano il "segno" del valore gestito:

Lsl(valore, spostamento)

o a destra:

Lsr(valore, spostamento)

Spostamento dei bit senza uso delle spedifiche funzioni di Gambas

Possiamo, però, ottenere lo stesso risultato, restituito dalle predette spedifiche funzioni di Gambas, effettuando semplici operazioni.

Operazione per lo spostamento a sinistra

Per ottenere lo spostamento a sinistra di un bit si effettuerà una moltiplicazione del valore del bit da spostare per 2 elevato alla potenza determinata dal valore del secondo operando [Nota 1], ossia del numero dello spostamento delle posizioni da effettuarsi:

a << b  →  a * 2b

Esempio:

6 << 3  →  6 * 23  →  6 * 8  →  48

In Gambas la sintassi è:

Risultato = Numero * CInt(2 ^ Spostamento)


Operazione per lo spostamento a destra

Per ottenere lo spostamento a destra di un bit si effettuerà una divisione del valore del bit da spostare per 2 elevato alla potenza determinata dal valore del secondo operando, ossia del numero dello spostamento delle posizioni da effettuarsi:

a >> b  →  a \ 2b

Esempio:

16 >> 3  →  16 \ 23  →  16 \ 8  →  2

In Gambas la sintassi è:

Risultato = Numero \ CInt(2 ^ Spostamento)


Note

[1] Si moltiplica per due, poiché il valore del numero binario viene costruito moltiplicando le cifre di tale numero per le potenze di 2.
Esempio:

10101010 = 1*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0  = 170