Differenze tra le versioni di "Sostituire gli operatori logici di spostamento dei bit con semplici operazioni"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
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:
+
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:
 
oppure uno spostamento a destra:
Riga 7: Riga 7:
 
Così, ad esempio, il valore 16 è il primo operando, mentre 2 è il secondo operando:
 
Così, ad esempio, il valore 16 è il primo operando, mentre 2 è il secondo operando:
 
  16 << 2
 
  16 << 2
<FONT Color=#B22222>i bit del valore 16 sono spostati a sinistra di 2 posizioni</font>. Contestualmente i bit così liberati sono riempiti da bit posti a <SPAN Style="text-decoration:underline">zero</span>.
+
<FONT Color=#B22222>i bit del valore 16 sono spostati a sinistra di 2 posizioni</font>.
 +
<BR>Contestualmente i bit così liberati sono riempiti da bit posti a <SPAN Style="text-decoration:underline">zero</span>.
  
 
Pertanto se in questo esempio il primo operando è rappresentato inizialmente dal valore 16:
 
Pertanto se in questo esempio il primo operando è rappresentato inizialmente dal valore 16:
Riga 18: Riga 19:
 
==Lo ''spostamento'' in Gambas==
 
==Lo ''spostamento'' in Gambas==
 
In Gambas, come si sa, esistono alcune funzioni specifiche per effettuare lo spostamento dei bit a sinistra.
 
In Gambas, come si sa, esistono alcune funzioni specifiche per effettuare lo spostamento dei bit a sinistra.
<BR>Due che salvaguardano il "''segno''" del valore gestito:
+
<BR>Due che <SPAN Style="text-decoration:underline">salvaguardano</span> il ''segno'' del valore gestito:
 
  Shl(valore, spostamento)
 
  Shl(valore, spostamento)
 
o a destra:
 
o a destra:
 
  Shr(valore, spostamento)
 
  Shr(valore, spostamento)
e due che ignorano il "''segno''" del valore gestito:
+
e due che <SPAN Style="text-decoration:underline">ignorano</span> il ''segno'' del valore gestito:
 
  Lsl(valore, spostamento)
 
  Lsl(valore, spostamento)
 
o a destra:
 
o a destra:

Versione delle 16:05, 13 dic 2021

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 di ciascun bit del primo operando avviene di un numero di posizioni uguale al valore del secondo operando.

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

 ↶↶
01000000 


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