Newsgroup: it.comp.lang.c
Titolo: Una curiosità banale

Ciao a tutti,
ormai e' da un po' di tempo che uso il linguaggio C e durante la
preparazione di un esame,mi sono accorto dell'esistenza degli operatori di
shift, a parte il loro significato teorico, che ho assimilato, non riesco a
capire in che tipo di codice poosa essere utile, se non per scopi
specialistici sulle operazioni binarie, per cui vi sarei grato se qualcuno
potrebbe spedirmi via e-mail qualche esempio concreto di codice, e le
tecniche per poter sfruttare questi peratori.
Medesima cosa dicasi per gli operatori unari, qualcuno avrebbe del codice
dove sono utilizzati? In quanto io non ho trovato nulla sui libri che ho
consultato, e l professore che avevo mi aveva al tempo congedato con una
speditiva descrizione di tali comandi.
Ciao a tutti e grazie.
--
e-mail: 
enrico...@petra.die.unige.it
===============================
Se una donna fosse onesta la meta' di una buona birra,
nessuno berrebbe piu' birra ... (Enrico)

dove sono utilizzati? In quanto io non ho trovato nulla sui libri che ho
Questo dubbio mi lascia piu` perplesso, comunque le piccole funzioni
di cui sopra gia` ti mostrano anche l'uso di due operatori unari, ~ per
invertire ogni bit dell'operando, e ! per ritornare 0 o 1 a seconda che
l'operando sia diverso o eguale a 0 (nell'idioma "!!x" che equivale a 
"0!=x").  Piu` banalmente, se hai ad esempio una funzione finito() che
ti torna 1 se hai finito e 0 se non hai ancora finito, e` normale
scrivere
        while(!finito()) {
            /* operazioni varie */
        }
anche se potresti equivalentemente scrivere "while(0==finito())".
Alex


Beh, non servono solo in campo specialistico:
- se devi moltiplicare un numero per 2^n, puoi shiftare tale numero verso
sinistra di n posti:
X <<= n;
(logicamente bisogna stare mooolto attenti a non uscire dai limiti!!)
- una funzione che può essere un po' più interessante: se lavori in modalità
grafica 320x200 (ad esempio), è molto ricorrente la moltiplicazione per 320.
Perciò possiamo definire la seguente macro, che accelera notevolmente tale
calcolo (e fa uso, fra l'altro degli operatori shift):
a * 320 = a * (256+64) = a*256 + a*64 = a*2^8 + a*2^6, quindi:
#define x320(a) (a<<8 + a<<6)
fra l'altro, nel caso che ho citato, questa macro non eccede mai oltre i
limiti, se a è un intero a 16 bit (unsigned int)
Ciao
Emanuele Cesena
d.a.m...@iol.it
           Attenti all'antispam NOSPAZ
http://www.geocities.com/SiliconValley/Grid/8879
trovate ora l'editor per i livelli di Bubble2000!! :-))
ICQ n° #10570672

#define x320(a) (a<<8 + a<<6)
Idea graziosa, ma, ATTENTI a verificare queste
"ottimizzazioni" "sul campo" prima di usarle su di
una data macchina...!
Il mio solito AMD K6-300 casalingo, 32767 di
queste operazioni, tempi misurati con le solite
QueryPerformanceEcc,migliore di 10 prove:
unsigned short    4765 microsecondi
int                         4728 microsecondi
mentre, con una normale moltiplicazione:
unsigned short    4148 microsecondi
int                         4142 microsecondi
Quindi su questa CPU, con questo dato compilatore
(VC++5), SO (Win98), ecc ecc, l'ottimizzazione puo`
in realta` costare un 15% circa di prestazioni.
Senza dubbio l'ottimizzazione funziona invece su CPU
piu` "classiche", che soffrivano molto sulla parte piu`
"matematica", come una moltiplicazione; quelle di oggi
tendono a moltiplicare un poco meglio, quindi...
Alex


Già, in effetti ci ho pensato, soprattutto dopo il tuo ultimo messaggio
sulla virgola mobile.
Il punto è che è un giochino per DOS, che non richiede grossi processori
(dovrebbe bastare un 386), quindi nonzo... se sul tuo K6 perde un 15%, in
generale penso che sia migliore... comunque lo terrò a mente :-)
Ciao
Emanuele Cesena
d.a.m...@iol.it
           Attenti all'antispam NOSPAM
