Operatore di shift left

di il
7 risposte

Operatore di shift left

Buonsalve,
seguendo le slide del corso universitario , ho capito che "fare uno shift left di una variabile di Tipo unsigned char" ci restituisce come risultato (visto nella sua rappresentazione decimale) "il prodotto di quel valore PER multipli di 2 fintanto che i bit più significativi usciti\eliminati dalla sequenza sono degli 0".
Tuttavia, dichiarata la variabile op1 di Tipo unsigned char ed assegnato ad essa il valore 61 , le slide mi dicono che il valore risultante dall'operazione op1<<3 dev'essere 232.

Questo risultato non mi torna , perché seguendo la logica dovrebbe essere : 61 * 2^2=244.

Inizialmente pensavo che quel valore 232 fosse dovuto ad un overflow , ma non è così perché il massimo numero rappresentabile con 8 bit è 255.
Domanda: perché 232?

7 Risposte

  • Re: Operatore di shift left

    2^3 non 2^2
  • Re: Operatore di shift left

    Premessa: grazie per la risposta =)

    Ma lì dice "finché a sinistra non esce qualche bit ad 1", quindi mi aspetto che lo spostamento che determina l'uscita del bit 1 dopo quella dei due bit 0, non vada preso in considerazione.
    In ogni caso , anche se facessi 2^3 mi ritroverei con 61*2^3, che fa 488 . La domanda persiste: perché 232?
  • Re: Operatore di shift left

    Non hai capito. Per tre shift moltiplichi per 2^3.
    Il risultato 488 è a 9 bit e il primo a sinistra lo ignori dato che consideri i rimanenti 8. Quindi 488-256=232
  • Re: Operatore di shift left

    Domanda: Se facessi op1<<4 cioè se facessi quattro shift left, mi ritroverei con : [(61*2^3)-256]*2]-256 =208 ?
    Cioè ogni qualvolta elimino il bit più significativo dalla sequenza di 9 bit e questo bit è 1 , devo:
    " sottrarre a quel che ho ottenuto (dal risultato delle moltiplicazioni PER 2 associate ad ogni spostamento eseguito fino a quel punto , ultimo spostamento compreso) quell'ultimo contributo 1*2^8 (che entrerebbe in gioco se volessimo convertire la sequenza di 9 bit da binario a decimale)"
    Confermi?
  • Re: Operatore di shift left

    Si fa 61*2^4 e poi il risultato mod 256 oppure risultato and 255. La questione degli 1 che escono ti sta confondendo, lasciala stare.

    Quindi

    (61*2^4) mod 256 = 208

    in generale

    (v*2^n) mod 256

    in cui v è il byte iniziale ed n il numero di shift
    Per una CPU

    (v<<n) & 255
  • Re: Operatore di shift left

    Da un punto di vista puramente di calcolo le due formule mi portano allo stesso risultato ottenuto seguendo la logica del:
    " moltiplico per 2 ed ogni qualvolta esce un 1 sottraggo 2^8".
    Quello che però mi interessa capire è : perché mod256 e perché &255 ?
  • Re: Operatore di shift left

    Perché a te interessano solo gli 8 bit finali. Gli altri bit di ordine superiore, dopo il calcolo, li ignori usando una delle due operazioni ...

    Avete studiato le nozioni principali dei sistemi di numerazione posizionale? Decimale binario esadecimale?
Devi accedere o registrarti per scrivere nel forum
7 risposte