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

Da Gambas-it.org - Wikipedia.
 
(20 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 nuomero diposizioni eguale 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====
In Gambas, come si sa, esistono due funzioni specifiche per effettuare lo spostamento dei bit 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.
 +
<BR>Due che <SPAN Style="text-decoration:underline">salvaguardano</span> il ''segno'' del valore gestito:
 
  Shl(valore, spostamento)
 
  Shl(valore, spostamento)
o destra:
+
o a destra:
 
  Shr(valore, spostamento)
 
  Shr(valore, spostamento)
 +
e due che <SPAN Style="text-decoration:underline">ignorano</span> il ''segno'' del valore gestito:
 +
Lsl(valore, spostamento)
 +
o a destra:
 +
Lsr(valore, spostamento)
  
  
Possiamo, però, ottenere lo stesso risultato mediante semplici operazioni.
+
==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''===
 
===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, ossia del numero dello spostamento delle posizioni da effettuarsi:
+
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 <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>, ossia del numero dello spostamento delle posizioni da effettuarsi:
 
  a << b  →  a * 2<SUP>b</sup>
 
  a << b  →  a * 2<SUP>b</sup>
 
Esempio:
 
Esempio:
  6 << 3  →  a * 2<SUP>3</sup>  →  6 * 8  →  48
+
  6 << 3  →  6 * 2<SUP>3</sup>  →  6 * 8  →  48
 +
 
 +
In Gambas la sintassi è:
 +
Risultato = Numero * CInt(2 ^ Spostamento)
  
  
 
===Operazione per lo spostamento a ''destra''===
 
===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:
 
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 / 2<SUP>b</sup>
+
  a >> b  →  a \ 2<SUP>b</sup>
 
Esempio:
 
Esempio:
  16 >> 3  →  16 / 2<SUP>3</sup>  →  16 / 8  →  2
+
  16 >> 3  →  16 \ 2<SUP>3</sup>  →  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.<BR>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

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