轨道
/
WebAssembly
WebAssembly
/
练习
/
All Your Base
All Your Base

All Your Base

中等

简介

你刚刚被聘为数学教授。 第一周过得挺顺利,可到了第二周,事情有点不对劲。 问题是,学生们给出的每一个答案都是错的! 好在凭你的数学功底,你找出了症结所在:学生的答案确实是对的,只不过它们全都以 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⁰)

没错。上面这三个数字完全一样。恭喜!

WebAssembly 专用说明

WebAssembly 导出函数convert的签名如下:

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

前两个参数$arrOffset和$arrLength表示一个 32 位有符号整数数组的起始偏移量和长度。长度参数以数组中的元素个数为单位,而不是字节数。在调用这个函数之前,调用方要把这个数组写入 WebAssembly 线性内存中,起始位置为偏移量$arrOffset。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)。前两个值是你的输出在线性内存中的offset和length。如果你愿意,可以覆盖用于输入的线性内存地址。第三个返回值是一个用于错误处理的 i32 状态码。

如果第三个返回值表示错误状态,单元测试不会读取前两个返回值。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
WebAssembly Exercism

准备好开始 All Your Base 了吗?

注册 Exercism,借助 87 个练习 和真人导师指导,学习并掌握 WebAssembly,全部免费。