Giarados (Ex-Member)
Pro
Messaggi: 69
Iscritto: 25/07/2010
|
Ciao,
mentre leggevo in mio libro sul C durante la trattazione dei puntatori l'autore ha buttato giù tra il terzo e il quinto capitolo un intero capitolo dedicato ai Binary bits, base 2, manipolazione di singoli bit e operatori logici binari. Sinceramente mi ha confuso un pò e non ne ho capito un gran che. Devo approfondire l'argomento e perdervi tempo oppure posso anche ignorarlo? Non conosco l'importanza nella pratica di questi concetti teorici..
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
ignoralo... potrai tornare ad approfondire l'argomento quando avrai piena padronanza del C.
Sono argomenti utilizzati soltanto in rarissime situazioni. Io ad esempio li ho usati estensivamente per programmare un engine grafico con rasterizzazione 3D in software, e per la decompressione di immagini in PCX e Jpeg. Ma per programmi più semplici non ti serviranno mai.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Le operazioni a livello di bit possono essere molto utili in certe situazioni (in particolare quando si tratta di aumentare le performance su certi algoritmi). A volte sono addirittura necessarie, ad esempio se dovrai mai sviluppare device drivers.
In linea generale, secondo me sono rare le occasioni in cui ti servirà conoscere questi dettagli, ma per poter dire di conoscere il C (e non solo le sue parti ad alto livello) sarebbe bene avere una buona infarinatura di queste nozioni. Non sono poi nemmeno complicate... se non le hai capite vuol dire che il libro non le ha spiegate bene. Chiedi pure in questo forum per chiarimenti.
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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,
Codice sorgente - presumibilmente Plain Text |
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" Ultima modifica effettuata da TheKaneB il 20/10/2010 alle 21:37 |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Pitagora:
un altro problema, che significa questa scrittura:
Codice sorgente - presumibilmente Plain Text |
nello specifico 0xfff |
AND binario con il numero 0xFFF espresso in base esadecimale (o base 16).
In pratica invece di usare i numero da 0 a 9, siccome ci servono 16 simboli per le cifre, prendiamo in prestito anche le prime 6 lettere dell'alfabeto dalla A alla F.
F significa 15, mentre 10 significa 16 in esadecimale.
L'AND binario invece..... no, è troppo lungo, ti linko una mia vecchia guida che facciamo prima xD
http://www.oscene.net/it/programmazione/c/capire-e-sfrutta ...
buona lettura |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
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,
Codice sorgente - presumibilmente Plain Text |
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
Ultima modifica effettuata da Pitagora il 20/10/2010 alle 20:50 |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
come sempre, molto dettagliato... Grazie
|
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
un altro problema, che significa questa scrittura:
Codice sorgente - presumibilmente Plain Text |
nello specifico 0xfff
|
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Grazie ancora, la mia domanda non era riferita sull' and bensì sul cosa fosse 0xFFFF; Ora so che è un numero esadecimale e 0x è il prefisso da mettere
|
|