|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
shiftare a dx e sx
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?
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
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 |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
![]()
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
|
![]() |
![]() |
![]() |
#4 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Codice:
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; } |
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
![]() 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. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
Veramente no...comunque qual è il senso di shiftare a destra o sinistra i bit?
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
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..
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
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...
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
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.. ![]()
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
|
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
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. Quote:
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.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
||
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
praticamente dovrei ottenere 11010 000. Come faccio ad ottenere ciò? devo moltiplicare 10111010 per 00001000???
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
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)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#13 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
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. Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Quote:
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?
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() Ultima modifica di ciccio er meglio : 28-03-2008 alle 20:29. |
|
![]() |
![]() |
![]() |
#15 | |||
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
No comunque calcolatori l'ho gia' dato. 12 anni fa piu' o meno ![]() Quote:
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. Quote:
Sono anni che comunque non "lavoro" piu' con l'ASM cosi' a basso livello, quindi potrei sbagliare.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|||
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
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. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 4834
|
Vedo con piacere che ancora ricordate queste cose. Bene bene, vuol dire che a qualche cosa vi sono servite
![]() Grazie per l'aiuto ![]()
__________________
Amareggiato per la chiusura di mezzo forum Off-topic. Riapritelooo! ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:22.