PDA

View Full Version : shiftare a dx e sx


ciccio er meglio
28-03-2008, 17:33
Ciao ragazzi ho un dubbio.

Ho letto che shiftare a sinistra di n bit significa moltiplicare per 2^n

In particolare che cosa significa?

Se, per esempio io ho questo byte: 10111010 e lo voglio shiftare a sx di 3 bit che succede?

wingman87
28-03-2008, 17:48
10111010 diventa 11010000
Ma io non direi che shiftare a sx "significa" moltiplicare per 2^n, diciamo che è un modo di vedere le cose, ma è molto più semplice pensare allo spostamento verso sx di tutti i bit

ciccio er meglio
28-03-2008, 17:50
10111010 diventa 11010000
Ma io non direi che shiftare a sx "significa" moltiplicare per 2^n, diciamo che è un modo di vedere le cose, ma è molto più semplice pensare allo spostamento verso sx di tutti i bit

capito. Grazie ;)

mjordan
28-03-2008, 18:05
Ciao ragazzi ho un dubbio.

Ho letto che shiftare a sinistra di n bit significa moltiplicare per 2^n

In particolare che cosa significa?

Se, per esempio io ho questo byte: 10111010 e lo voglio shiftare a sx di 3 bit che succede?


int main(int argc, char **argv)
{
unsigned int value = 4; /* 4 = 0000 0100 */
unsigned int shift = 2;

value <<= shift; /* 16 = 0001 0000 */
value <<= shift; /* 64 = 0100 0000 */

printf("%d\n", value); /* stampa 64 */
return 0;
}


Capito?

mjordan
28-03-2008, 18:06
10111010 diventa 11010000
Ma io non direi che shiftare a sx "significa" moltiplicare per 2^n, diciamo che è un modo di vedere le cose, ma è molto più semplice pensare allo spostamento verso sx di tutti i bit

Non è un modo di vedere le cose, è proprio la risultante dell'operazione di shifting dei bit a sinistra. ;)
Poi ci sono molte considerazioni da fare sullo shifting logico e aritmetico, il troncamento, ecc. ecc. L'argomento è molto complesso se uno deve analizzarlo in dettaglio. Non in tutti i casi infatti il bit perso viene sostituito con uno 0.

ciccio er meglio
28-03-2008, 18:07
int main(int argc, char **argv)
{
unsigned int value = 4; /* 4 = 0000 0100 */
unsigned int shift = 2;

value <<= shift; /* 16 = 0001 0000 */
value <<= shift; /* 64 = 0100 0000 */

printf("%d\n", value); /* stampa 64 */
return 0;
}


Capito?


Veramente no...comunque qual è il senso di shiftare a destra o sinistra i bit?

ciccio er meglio
28-03-2008, 18:14
int main(int argc, char **argv)
{
unsigned int value = 4; /* 4 = 0000 0100 */
unsigned int shift = 2;

value <<= shift; /* 16 = 0001 0000 */
value <<= shift; /* 64 = 0100 0000 */

printf("%d\n", value); /* stampa 64 */
return 0;
}


Capito?

ah forse ho capito. Se shifto 0000 0100 di due posizioni a sx diventa 0001 0000

Ed è come se l'avessi moltiplicato per 2 ^2

Comunque il ragionamento della moltiplicazione ha senso e si capisce solo se si usa un esempio con un byte che ha un solo 1 (cioé l'esempio che hai fatto tu). Altrimenti non si capisce nulla..

wingman87
28-03-2008, 18:57
Non è un modo di vedere le cose, è proprio la risultante dell'operazione di shifting dei bit a sinistra. ;)

Non ho capito cosa intendi, o forse non mi sono fatto capire io nel mio intervento precedente. Intendevo dire che è molto più semplice vedere l'operazione di shift come uno spostamento dei bit che non come una moltiplicazione. Il fatto che il risultato sia lo stesso non implica che quello sia il suo "significato". Se invece intendi che al livello della macchina l'operazione eseguita è proprio quella della moltiplicazione, questo non lo sapevo ma mi sembra strano...

ciccio er meglio
28-03-2008, 19:11
Non ho capito cosa intendi, o forse non mi sono fatto capire io nel mio intervento precedente. Intendevo dire che è molto più semplice vedere l'operazione di shift come uno spostamento dei bit che non come una moltiplicazione. Il fatto che il risultato sia lo stesso non implica che quello sia il suo "significato". Se invece intendi che al livello della macchina l'operazione eseguita è proprio quella della moltiplicazione, questo non lo sapevo ma mi sembra strano...

Che io sappia le cpu non eseguono calcoli cosi complessi. Cioè la moltiplicazione la fanno ma emulata. Per esempio per fare 4x3 sommano 3 volte 4.

Comunque qual è il senso di shiftare a destra o sinistra i bit?

Da quello che ho capito non è che si fa una vera moltiplicazione o divisione con lo shift..:confused:

gugoXX
28-03-2008, 19:25
Che io sappia le cpu non eseguono calcoli cosi complessi. Cioè la moltiplicazione la fanno ma emulata. Per esempio per fare 4x3 sommano 3 volte 4.

Nono, le cpu che abbiamo oggi eseguono la moltiplicazione proprio, ed eseguono algoritmi ben piu' complessi.
Esternamente gli si da il comando di moltiplicare 2 valori.
E lei esegue il tutto, senza scomporre l'operazione in altre operazioni come forse hai capito tu.

Elettricamente ci sono vari stadi della ALU della CPU che eseguono una moltiplicazione, e l'algoritmo logico che esegue e' quello della moltiplicazione che abbiamo imparato a fare alle elementari, solo fatto in base 2 invece che in base 10.


Comunque qual è il senso di shiftare a destra o sinistra i bit?

Da quello che ho capito non è che si fa una vera moltiplicazione o divisione con lo shift..:confused:
be' e' una vera divisione o moltiplicazione, ma un po' particolare in quanto serve per moltiplicare o dividere solo per 2 o potenze.

Shiftare a destra di 1 bit significa dividere per 2.
Shiftare a sinistra di 1 bit significa moltiplicare per 2.
Al che se shifto di 2 bit a sinistra moltiplichero' 2 volte per 2, ovvero per 4
Se shifto di 3 bit a sinistra, allora moltiplichero' 3 volte per 2, ovvero per 8

Oggi e' quasi sempre piu' conveniente dividere per 3 direttamente, invece che farlo con gli shift a destra e le sottrazioni.

ciccio er meglio
28-03-2008, 20:00
Nono, le cpu che abbiamo oggi eseguono la moltiplicazione proprio, ed eseguono algoritmi ben piu' complessi.
Esternamente gli si da il comando di moltiplicare 2 valori.
E lei esegue il tutto, senza scomporre l'operazione in altre operazioni come forse hai capito tu.

Elettricamente ci sono vari stadi della ALU della CPU che eseguono una moltiplicazione, e l'algoritmo logico che esegue e' quello della moltiplicazione che abbiamo imparato a fare alle elementari, solo fatto in base 2 invece che in base 10.


be' e' una vera divisione o moltiplicazione, ma un po' particolare in quanto serve per moltiplicare o dividere solo per 2 o potenze.

Shiftare a destra di 1 bit significa dividere per 2.
Shiftare a sinistra di 1 bit significa moltiplicare per 2.
Al che se shifto di 2 bit a sinistra moltiplichero' 2 volte per 2, ovvero per 4
Se shifto di 3 bit a sinistra, allora moltiplichero' 3 volte per 2, ovvero per 8

Oggi e' quasi sempre piu' conveniente dividere per 3 direttamente, invece che farlo con gli shift a destra e le sottrazioni.

quindi nel mio caso shiftando 10111010 di 3 posizioni a sinistra è come se lo moltiplicassi per 2^3 cioè per 8. Ma come faccio a verificare questa regola?

praticamente dovrei ottenere 11010 000. Come faccio ad ottenere ciò?

devo moltiplicare 10111010 per 00001000???

gugoXX
28-03-2008, 20:06
quindi nel mio caso shiftando 10111010 di 3 posizioni a sinistra è come se lo moltiplicassi per 2^3 cioè per 8. Ma come faccio a verificare questa regola?

praticamente dovrei ottenere 11010 000. Come faccio ad ottenere ciò?

devo moltiplicare 10111010 per 00001000???


Beh, ti sei gia' mangiato qualcosa shiftando, fallo con numeri piu' piccoli, oppure prevedi un po' di spazio per i bit a 1 che escono a sinistra.

tipo
0000 0000 1011 1010
Shiftato a sinistra di 3, che equivale a moltiplicare per 8, ottieni
0000 0101 1101 0000

Se si come trasformare da base 2 a base 10 puoi fare la prova.
Altrimenti ti fidi... (PS: Se sei proprio nella c...a, puoi sempre provare ad usare la calcolatrice scientifica di windows)

cdimauro
28-03-2008, 20:14
Ciao ragazzi ho un dubbio.

Ho letto che shiftare a sinistra di n bit significa moltiplicare per 2^n

In particolare che cosa significa?

Se, per esempio io ho questo byte: 10111010 e lo voglio shiftare a sx di 3 bit che succede?
In QUESTO caso ottieni lo stesso risultato della moltiplicazione per 8.

Comunque le operazioni di shifting sono "particolari": molti linguaggi non specificano in maniera precisa cosa succede, e "demandano" tutto al compilatore e/o all'architettura su cui sta girando l'applicazione.
Oggi e' quasi sempre piu' conveniente dividere per 3 direttamente, invece che farlo con gli shift a destra e le sottrazioni.
No no: la divisione rimane ancora la "bestia nera" dei calcolatori, e richiede parecchi cicli di clock per poter essere portata a termine (rispetto a somma, sottrazione, shift, ma anche alla stessa moltiplicazione). ;)

ciccio er meglio
28-03-2008, 20:27
Se sai come trasformare da base 2 a base 10 puoi fare la prova.
Altrimenti ti fidi... (PS: Se sei proprio nella c...a, puoi sempre provare ad usare la calcolatrice scientifica di windows)

Ok ci provo:

10111010 x 00001000 <=> 186 x 8

186*8=1488 che in binario fa 10111010000

Eliminando i primi 3 bit ottengo 11010000!

Ok credo di aver capito :)


PS. Percaso anche voi state studiando calcolatori?

gugoXX
28-03-2008, 20:32
Ok ci provo:

10111010 x 00001000 <=> 186 x 8

186*8=1488 che in binario fa 10111010000

Eliminando i primi 3 bit ottengo 11010000!

Ok credo di aver capito :)


PS. Percaso anche voi state studiando calcolatori?

Ok.
No comunque calcolatori l'ho gia' dato.
12 anni fa piu' o meno :D



No no: la divisione rimane ancora la "bestia nera" dei calcolatori, e richiede parecchi cicli di clock per poter essere portata a termine (rispetto a somma, sottrazione, shift, ma anche alla stessa moltiplicazione). ;)

Mmmh.
Forse dividere per 3 resta piu' vantaggioso con shift e sottrazioni.
Ma quando i bit ad uno sono piu' di 2 secondo me non conviene o siamo al pelo.


On Core 2 CPUs, division operations process two bits per clock cycle. The new divider circuit implemented on Penryn is able to process four bits per clock cycle, meaning it is two times faster on division operations that Core 2 CPUs.

La divisione a 32bit sulle CPU nuove ci impiega quindi 8 cicli!!! E a naso stalla meno registri di usare solo shift e sottrazioni.
Sono anni che comunque non "lavoro" piu' con l'ASM cosi' a basso livello, quindi potrei sbagliare.

cdimauro
28-03-2008, 20:39
In effetti soli 8 cicli di clock è un notevole risultato per la divisione. Ottima architettura quella di Penryn. :)

Comunque per valori piccoli o con pochi "bit a 1", come dicevi, non è conveniente.

x ciccio: anch'io ho dato l'esame di architetture degli elaboratori una dozzina d'anni fa. :p

ciccio er meglio
28-03-2008, 21:17
Vedo con piacere che ancora ricordate queste cose. Bene bene, vuol dire che a qualche cosa vi sono servite :)

Grazie per l'aiuto ;)