Sei appena stato assunto come professore di matematica. La prima settimana è andata bene, ma nella seconda c'è qualcosa che non va. Il problema è che tutte le risposte dei tuoi studenti sono sbagliate! Per fortuna, le tue competenze matematiche ti hanno permesso di individuare il problema: le risposte degli studenti sono corrette, ma sono tutte in base 2 (binario)! Sorprendentemente, si scopre che ogni settimana gli studenti usano una base diversa. Per aiutarti a verificare rapidamente le risposte degli studenti, costruirai uno strumento per convertire tra basi diverse.
Converti una sequenza di cifre in una base, che rappresenta un numero, in una sequenza di cifre in un'altra base, che rappresenta lo stesso numero.
Prova a implementare la conversione per conto tuo. Non usare qualcos'altro che esegua la conversione al posto tuo.
Nella notazione posizionale, un numero in base b può essere visto come una combinazione lineare di potenze di b.
Il numero 42, in base 10, significa:
(4 × 10¹) + (2 × 10⁰)
Il numero 101010, in base 2, significa:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
Il numero 1120, in base 3, significa:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Sì. Quei tre numeri qui sopra sono esattamente lo stesso numero. Complimenti!
La firma della funzione per l'export WebAssembly convert è la seguente:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
I primi due parametri $arrOffset e $arrLength esprimono l'offset di base e la lunghezza di un array di interi con segno a 32 bit. Il parametro della lunghezza è espresso in numero di elementi dell'array, non in byte. Prima di chiamare questa funzione, il chiamante scrive questo array nella memoria lineare di WebAssembly a partire dall'offset $arrOffset. La memoria lineare di WebAssembly è sempre espressa in little-endian.
Quindi il chiamante codificherebbe l'array [1,2] come la seguente sequenza di otto byte.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
I parametri $inputBase e $outputBase non coinvolgono la memoria lineare.
Il tipo del risultato è (i32 i32 i32). I primi due valori sono l'offset e la length dell'output in memoria lineare. Se preferisci, puoi sovrascrivere gli indirizzi della memoria lineare usati per l'input. Il terzo valore restituito è un codice di stato i32 usato per la gestione degli errori.
Se il terzo valore restituito esprime uno stato di errore, i test unitari non leggono i primi due valori restituiti.
Iscriviti a Exercism per imparare e padroneggiare WebAssembly con 87 esercizi e il mentoring di persone reali, tutto gratis.