All Your Base

All Your Base

中級

はじめに

数学の教授として採用されたばかりです。 最初の1週間は順調でしたが、2週目になって、何かがおかしいと感じます。 問題は、学生たちが答えるすべての答えが間違っていることです! 幸いなことに、数学の力で問題の正体がわかりました。学生の答えは_正しい_のですが、すべて2進数(基数2)で書かれているのです! 驚くべきことに、学生たちは週ごとに違う基数を使っていることがわかります。 学生の答えをすばやく確かめられるように、基数を変換するツールを作ることになります。

説明

ある基数で数を表す数字の並びを、同じ数を表す別の基数の数字の並びに変換します。

Note

基数変換は自分で実装してみましょう。 変換を代わりにやってくれるものを使わないでください。

位取り記数法について

位取り記数法では、基数bの数は、bの累乗の線形結合として捉えることができます。

42という数を_基数10で_表すと、次のようになります。

(4 × 10¹) + (2 × 10⁰)

101010という数を_基数2で_表すと、次のようになります。

(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)

1120という数を_基数3で_表すと、次のようになります。

(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)

そうです。上の3つの数は、どれもまったく同じ数です。おめでとうございます!

WebAssembly固有の注意点

WebAssemblyのエクスポートconvertの関数シグネチャは次のとおりです。

(func (export "convert")
    (param $arrOffset i32)
    (param $arrLength i32)
    (param $inputBase i32)
    (param $outputBase i32)
    (result i32 i32 i32)
)

最初の2つの仮引数$arrOffsetと$arrLengthは、32ビット符号付き整数の配列の先頭オフセットと長さを表します。長さの仮引数は、バイト数ではなく、配列の要素数で表されます。この関数を呼び出す前に、呼び出し側はこの配列を、オフセット$arrOffsetから始まるWebAssemblyの線形メモリに書き込みます。WebAssemblyの線形メモリは常にリトルエンディアンで表現されます。

したがって、呼び出し側は配列[1,2]を、次の8バイトの並びとしてエンコードすることになります。

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,

仮引数$inputBaseと$outputBaseは、線形メモリとは関係ありません。

結果の型は(i32 i32 i32)です。最初の2つの値は、線形メモリ上にある出力のoffsetとlengthです。必要であれば、入力に使った線形メモリのアドレスを上書きしてもかまいません。3つ目の戻り値は、エラー処理に使うi32のステータスコードです。

3つ目の戻り値がエラー状態を表している場合、ユニットテストは最初の2つの戻り値は読み取りません。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
WebAssembly Exercism

All Your Baseを始める準備はできましたか?

Exercismに登録すれば、87個の演習、そして本物の人間によるメンタリングとともに、WebAssemblyを学んでマスターできます。すべて無料です。