[Reti logiche] Aritmetica cambio base

Messaggioda Lorenzo_99 » 17/12/2020, 11:56

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?
Lorenzo_99
Junior Member
Junior Member
 
Messaggio: 101 di 253
Iscritto il: 18/10/2019, 18:29

Re: [Reti logiche] Aritmetica cambio base

Messaggioda solaàl » 17/12/2020, 12:16

Perché \(51_6 = 1 + 5\cdot 6=31_{10}\), ovviamente.
"In verità le cose che nella vita sono tenute in gran conto si riducono a vanità, o putredine di nessun valore; botoli che si addentano, bambocci litigiosi che ora ridono, poi tosto piangono." (Lotario conte di Segni)
Avatar utente
solaàl
Senior Member
Senior Member
 
Messaggio: 703 di 1672
Iscritto il: 31/10/2019, 01:45

Re: [Reti logiche] Aritmetica cambio base

Messaggioda Lorenzo_99 » 17/12/2020, 17:03

solaàl ha scritto: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...
Lorenzo_99
Junior Member
Junior Member
 
Messaggio: 102 di 253
Iscritto il: 18/10/2019, 18:29

Re: [Reti logiche] Aritmetica cambio base

Messaggioda solaàl » 17/12/2020, 17:49

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

Dato un numero in base 10, la sua rappresentazione in base b si ottiene così:
Codice:
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]

Codice:
   54 `inBase` 6
=> 34
   31 `inBase` 6
=> 19
   51 `inBase` 6
=> 31
   23 `inBase` 10
"In verità le cose che nella vita sono tenute in gran conto si riducono a vanità, o putredine di nessun valore; botoli che si addentano, bambocci litigiosi che ora ridono, poi tosto piangono." (Lotario conte di Segni)
Avatar utente
solaàl
Senior Member
Senior Member
 
Messaggio: 704 di 1672
Iscritto il: 31/10/2019, 01:45

Re: [Reti logiche] Aritmetica cambio base

Messaggioda Lorenzo_99 » 19/12/2020, 12:14

solaàl ha scritto:Dato un numero in base 10, la sua rappresentazione in base b si ottiene così:
Codice:
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è?
Lorenzo_99
Junior Member
Junior Member
 
Messaggio: 103 di 253
Iscritto il: 18/10/2019, 18:29


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite