Differenze tra le versioni di "Sostituire gli operatori logici di spostamento dei bit con semplici operazioni"
(22 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 | + | <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 | + | 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 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) | ||
− | |||
+ | ==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>[[[#Note|Nota 1]]]</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 → | + | 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 | + | a >> b → a \ 2<SUP>b</sup> |
Esempio: | Esempio: | ||
− | 16 >> 3 → 16 | + | 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.
Indice
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