Oppure

Loading
16/10/10 19:35
Giarados
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..
aaa
16/10/10 19:55
TheKaneB
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.
aaa
16/10/10 19:59
pierotofy
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.
Il mio blog: piero.dev
20/10/10 18:49
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 :-?
Ultima modifica effettuata da Pitagora 20/10/10 18:50
aaa
20/10/10 19:29
TheKaneB
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"
Ultima modifica effettuata da TheKaneB 20/10/10 19:37
aaa
21/10/10 18:50
Pitagora
come sempre, molto dettagliato... Grazie :k:
aaa
23/10/10 14:44
Pitagora
un altro problema, che significa questa scrittura:
numero & 0xfff;

nello specifico 0xfff
aaa
23/10/10 22:05
TheKaneB
Postato originariamente da Pitagora:

un altro problema, che significa questa scrittura:
numero & 0xfff;

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
oscene.net/it/programmazione/c/…

buona lettura :D
aaa