[Reti logiche] Aritmetica cambio base

lorenzo1234567
Buongiorno, non riesco a capire il funzionamento del cambio di base e del perchè si usi sempre la formula $A = sum_(i=0)^(n-1) a_i*beta^i$, con $a_i$ le cifre della rappresentazione di A (cioè $A=(a_(n-1)...a_1a_0)_beta$).

Volendo fare un esempio:
ho due cifre $c_1$ e $c_0$ in base 6 e voglio rappresentarle in base 2. Per fare questa conversione devo usare la formula riportata sopra, ovvero fare: $c_1 * 6 + c_0$ (il numero 6 ovviamente è usato come $111$).
La domanda è: perchè? Come fa a tornare corretto?

Se ho $c_1=101$ (rappresentazione di 5) e $c_0=001$ (rappresentazione di 1) devo convertire il numero 51 (base 6) in base 2. Dopo aver svolto i conti ottengo $11111$, che è la rappresentazione di 31 e non di 51!
Cosa non torna?

Risposte
solaàl
Perché \(51_6 = 1 + 5\cdot 6=31_{10}\), ovviamente.

lorenzo1234567
"solaàl":
Perché \(51_6 = 1 + 5\cdot 6=31_{10}\), ovviamente.

Credo di non aver capito :(
Cioè non capisco quando usarla e come usarla. Forse non sono entrato nel meccanismo...

solaàl
Il numero 51, in base sei, è il numero 31, in base dieci.

Dato un numero in base 10, la sua rappresentazione in base [inline]b[/inline] si ottiene così:
inBase :: Integer -> Integer -> Integer
inBase n b = foldl (f b) n0 ns
  where
    n0 = head $ digits n
    ns = tail $ digits n
    f b q p = q * b + p
    digits 0 = []
    digits x = digits (x `div` 10) ++ [x `mod` 10]

   54 `inBase` 6
=> 34
   31 `inBase` 6
=> 19
   51 `inBase` 6
=> 31
   23 `inBase` 10

lorenzo1234567
"solaàl":

Dato un numero in base 10, la sua rappresentazione in base [inline]b[/inline] si ottiene così:
inBase :: Integer -> Integer -> Integer
inBase n b = foldl (f b) n0 ns
  where
    n0 = head $ digits n
    ns = tail $ digits n
    f b q p = q * b + p
    digits 0 = []
    digits x = digits (x `div` 10) ++ [x `mod` 10]

Vedo che c'è una moltiplicazione e una somma e una divisione e un resto (modulo) ma onestamente, nonostante programmi con vari linguaggi da anni, non riesco a capire molto cosa fa questo codice.

In pratica quando devo convertire $n$ cifre da base $b$ a base $b'$ devo sempre fare $sum_(i=0)^(n-1)n_i*b$? Se sì, perchè?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.