你剛被聘為數學教授。 你的第 1 週過得很順利,但到了第 2 週,事情有點不對勁。 問題在於,學生給的每個答案都是錯的! 幸好,你的數學能力讓你找出了問題所在:學生的答案_確實_是對的,只是全都是二進位(以 2 為底)! 令人驚訝的是,原來學生每週使用的進位制都不一樣。 為了幫你快速驗證學生的答案,你將會打造一個能在不同進位制之間轉換的工具。
將某個進位制中的一串數字(代表一個數)轉換成另一個進位制中的一串數字,代表同一個數。
試著自己實作這個轉換吧。 不要使用其他現成的工具來幫你完成轉換。
在位值記數法中,一個以b為底的數可以理解為b的各次方的線性組合。
數字 42,以十進位表示,代表:
(4 × 10¹) + (2 × 10⁰)
數字 101010,以二進位表示,代表:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
數字 1120,以三進位表示,代表:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
沒錯。上面這三個數字完全相同。恭喜!
WebAssembly 匯出函式 convert 的函式簽章如下:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
前兩個參數 $arrOffset 和 $arrLength 分別表示一個 32 位元有號整數陣列的起始位移與長度。長度參數的單位是陣列元素的個數,而非位元組。在呼叫這個函式之前,呼叫端會把這個陣列寫入從位移 $arrOffset 開始的 WebAssembly 線性記憶體。WebAssembly 線性記憶體一律以小端序表示。
因此,呼叫端會把陣列 [1,2] 編碼成以下這八個位元組的序列。
| 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)。前兩個值是你的輸出在線性記憶體中的 offset 與 length。如果你想這麼做,也可以覆寫用於輸入的線性記憶體位址。第三個回傳值是用於錯誤處理的 i32 狀態碼。
如果第三個回傳值表示錯誤狀態,單元測試就不會讀取前兩個回傳值。