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:

primo_operando << secondo_operando

oppure uno spostamento a destra:

primo_operando >> secondo_operando

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


Dinamica dei bit in un esempio di spostamento a sinistra

Così, ad esempio, il valore 16 è il primo operando, mentre 2 è il secondo operando:

16 << 2

i bit del valore 16 sono spostati a sinistra di 2 posizioni.
Contestualmente i bit così liberati sono riempiti da bit posti a destra con valore zero.

Pertanto se in questo esempio il primo operando è rappresentato inizialmente dal valore 16:

00010000

dopo lo spostamento di due posizioni il primo operando assumerà il valore 64:

   ↶↶
0100000← 0←

Dinamica dei bit in un esempio di spostamento a destra

Analogamente nello spostamento a destra, se ad esempio il primo operando è rappresentato inizialmente dal valore 129:

129 >> 2

con la seguente rappresentazione in formato binario:

10000001

dopo lo spostamento di due posizioni il primo operando (in origine 129) assumerà il valore 32:

  ↷↷
→0 →0100000 Come si nota, il primo bit a destra a causa dello spostamento viene estromesso e perduto

Anche qui i bit spostati saranno sostituiti da bit posti ovviamente a sinistra con valore zero.

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 specifiche 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