방금 수학과 교수로 채용되었어요. 첫 주는 잘 지나갔는데, 둘째 주에는 뭔가 이상해요. 문제는 학생들이 내놓는 답이 전부 틀렸다는 거예요! 다행히도 수학 실력 덕분에 원인을 알아냈어요. 학생들의 답은 정말로 맞아요. 다만 모두 2진법(이진법)으로 되어 있을 뿐이에요! 놀랍게도, 매주 학생들은 서로 다른 진법을 사용한대요. 학생들의 답을 빠르게 확인할 수 있도록, 진법 사이를 변환해 주는 도구를 만들 거예요.
한 진법에서 어떤 수를 나타내는 숫자열을, 같은 수를 나타내는 다른 진법의 숫자열로 변환해요.
변환은 직접 구현해 봐요. 변환을 대신 해 주는 다른 것을 사용하지 마세요.
위치 기수법에서는 밑이 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 export 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]를 다음과 같은 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 상태 코드예요.
세 번째 반환 값이 오류 상태를 나타내면, 단위 테스트는 처음 두 반환 값을 읽지 않아요.
Exercism에 가입하고 WebAssembly 트랙을 연습 문제 87개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.