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

Da Gambas-it.org - Wikipedia.
 
(12 versioni intermedie di uno stesso utente non sono mostrate)
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 <SPAN Style="text-decoration:underline">sinistra</span> di un bit:
  '''<<'''
+
  primo_operando '''<<''' secondo_operando
oppure uno spostamento a destra:
+
oppure uno spostamento a <SPAN Style="text-decoration:underline">destra</span>:
  '''>>'''
+
  primo_operando '''>>''' secondo_operando
Lo spostamento del bit interessato avviene di un numero di posizioni uguale al valore del secondo operando.
+
<SPAN Style="text-decoration:underline">Lo spostamento di ciascun bit del primo operando avviene di un numero di posizioni uguale al valore del secondo operando</span>.
  
  
==Lo ''spostamento'' in Gambas==
+
====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
 +
<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 destra con valore <SPAN Style="text-decoration:underline">zero</span>.
 +
 
 +
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:
 +
    <FONT Size=4>↶↶</font>
 +
0'''1'''00000← 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:
 +
<FONT Size=4>  ↷↷</font>
 +
→0 →0'''1'''00000 <FONT Color=gray>''Come si nota, il primo bit a destra a causa dello spostamento viene estromesso e perduto''</font>
 +
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.
 
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:
 
  Lsr(valore, spostamento)
 
  Lsr(valore, spostamento)
 
  
==Spostamento dei bit senza uso delle spedifiche funzioni di Gambas==
+
 
 +
==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.
 
Possiamo, però, ottenere lo stesso risultato, restituito dalle predette spedifiche funzioni di Gambas, effettuando semplici operazioni.
  

Versione attuale delle 07:01, 3 nov 2022

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