Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Binary bits
Forum - C/C++ - Binary bits

Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 21:35
Sabato, 16/10/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..

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:55
Sabato, 16/10/2010
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.

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 21:59
Sabato, 16/10/2010
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: https://piero.dev
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:29
Mercoledì, 20/10/2010
Testo quotato

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

  1. 3<<3 = 18
  2. -----------
  3. 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
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 0:05
Domenica, 24/10/2010
Testo quotato

Postato originariamente da Pitagora:

un altro problema, che significa questa scrittura:
Codice sorgente - presumibilmente Plain Text

  1. 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
http://www.oscene.net/it/programmazione/c/capire-e-sfrutta ...

buona lettura :D

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:49
Mercoledì, 20/10/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

  1. 3<<3 = 18
  2. -----------
  3. 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
PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:50
Giovedì, 21/10/2010
come sempre, molto dettagliato... Grazie :k:

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 16:44
Sabato, 23/10/2010
un altro problema, che significa questa scrittura:
Codice sorgente - presumibilmente Plain Text

  1. numero & 0xfff;


nello specifico 0xfff

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 15:54
Domenica, 24/10/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

PM