Du wurdest gerade als Professor für Mathematik eingestellt. Deine erste Woche lief gut, aber in deiner zweiten Woche stimmt etwas nicht. Das Problem ist, dass jede Antwort deiner Studierenden falsch ist! Zum Glück hast du mit deinen Mathekenntnissen das Problem schnell gefunden: Die Antworten der Studierenden sind richtig, aber sie stehen alle im Zweiersystem (Binärsystem)! Erstaunlicherweise verwendet jede Woche eine andere Basis. Damit du die Antworten deiner Studierenden schnell überprüfen kannst, baust du ein Tool, das Zahlen zwischen verschiedenen Basen umrechnet.
Wandle eine Ziffernfolge in einer Basis, die eine Zahl darstellt, in eine Ziffernfolge in einer anderen Basis um, die dieselbe Zahl darstellt.
Versuche, die Umwandlung selbst zu implementieren. Verwende nichts anderes, um die Umwandlung für dich durchzuführen.
In der Positionsnotation lässt sich eine Zahl zur Basis b als Linearkombination von Potenzen von b verstehen.
Die Zahl 42, zur Basis 10, bedeutet:
(4 × 10¹) + (2 × 10⁰)
Die Zahl 101010, zur Basis 2, bedeutet:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
Die Zahl 1120, zur Basis 3, bedeutet:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Ja. Diese drei Zahlen oben sind genau dieselben. Herzlichen Glückwunsch!
Die Funktionssignatur für den WebAssembly-Export convert sieht wie folgt aus:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Die ersten beiden Parameter $arrOffset und $arrLength geben den Basis-Offset und die Länge eines Arrays aus vorzeichenbehafteten 32-Bit-Ganzzahlen an. Der Längenparameter wird in der Anzahl der Elemente im Array angegeben, nicht in Bytes. Bevor diese Funktion aufgerufen wird, schreibt der Aufrufer dieses Array in den linearen Speicher von WebAssembly, beginnend beim Offset $arrOffset. Der lineare Speicher von WebAssembly wird immer im Little-Endian-Format dargestellt.
Damit würde der Aufrufer das Array [1,2] als die folgende Abfolge von acht Bytes codieren.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Die Parameter $inputBase und $outputBase haben nichts mit dem linearen Speicher zu tun.
Der Ergebnistyp ist (i32 i32 i32). Die ersten beiden Werte geben den offset und die length deiner Ausgabe im linearen Speicher an. Wenn du möchtest, kannst du die Adressen des linearen Speichers überschreiben, die für die Eingabe verwendet werden. Der dritte Rückgabewert ist ein i32-Statuscode, der zur Fehlerbehandlung verwendet wird.
Wenn der dritte Rückgabewert einen Fehlerzustand ausdrückt, lesen die Unit-Tests die ersten beiden Rückgabewerte nicht.
Melde dich bei Exercism an, um WebAssembly mit 87 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.