Postato originariamente da Pitagora:
mi accodo qui, senza aprire topic aggiuntivi,anche perchè l'argomento e presso che identico. HO un dubbio sugli operatori << e >>. O meglio, ho capito come funzionano. Non mi è chiara una cosa, per approfondire meglio ho cercato varie guide sul web e sono venuto a conoscenza che questi operatori vengono usati per moltiplicare << e dividere >>. La cosa che non riesco a capire è la seguente,
3<<3 = 18
-----------
11<<3 = 11000 (18)
Detto questo arrivo al punto, perchè non si fa 3 * 3 (si tratta di moltiplicare) ma si fa 3 * (cost * 3). Dove cost è sempre 2
l'esempio che hai fatto è sbagliato: 3 << 3 = 24.
la cosa è semplice da spiegare, ma seguimi attentamente.
nella normale base decimale, ogni volta che "sposti le cifre a sinistra" moltiplichi per 10.
Mi spiego meglio con un esempio: 23 - 230 - 2300 - ecc...
potremmo usare la notazione 23 << 1 = 230, 23 << 2 = 2300 ecc...
in pratica spostando a sinistra di 2 cifre, aggiungiamo 2 zeri, quindi moltiplichiamo per 100... se facessimo uno shift a sinistra di 3,4 o 5 avremmo quindi una moltiplicazione per 1000, 10.000 o 100.000.
In altre parole possiamo definirlo come il prodotto per una potenza di 10 (1.000 = 10^3, 100.000 = 10^5, ecc... ).
quindi 23 << 4 = 23 * 10^4 = 23 * 10.000 = 230.000
Ecco... adesso passiamo in base 2, che è quella "parlata" dal computer.
ogni shift invece di moltiplicare per 10, moltiplica per 2.. Con lo stesso ragionamento di prima, uno shift di 4 posizioni moltiplica 4 volte per 2, quindi 2^4 = 16, ecc....
nel nostro caso quindi 3 << 3 = 3 * 2^3 = 3 * 8 = 24
ecco spiegato il mistero... per la divisione (shift a destra) il procedimento è analogo, soltanto che perdiamo il resto della divisione (gli ultimi bit se ne vanno a spasso).
=== Conclusione ===
per quale MOTIVO dovremmo usare questo metodo astruso per fare moltiplicazioni e divisioni per potenze di 2?
Il motivo risiede tutto nell'architettura della macchina sulla quale stiamo programmando. Ad esempio i processori più semplici non hanno l'istruzione per le divisioni, quindi ogni divisione comporta la chiamata di una procedura software molto lenta. Se vogliamo fare una divisione per 2, per esempio, basta fare un semplice shift a destra di 1, in questo modo spreco pochissimi cicli di clock invece di centinaia. Stessa cosa per la moltiplicazione.
Ci sono poi alcuni processori, come gli ARM, che hanno le operazioni di shift totalmente "gratis"