आपको अभी-अभी गणित के प्रोफेसर की नौकरी मिली है। आपका पहला सप्ताह अच्छा गुज़रा, लेकिन दूसरे सप्ताह में कुछ गड़बड़ है। समस्या यह है कि आपके विद्यार्थियों द्वारा दिया गया हर उत्तर गलत है! सौभाग्य से, आपके गणित के कौशल से आप यह पहचान पाए कि असली दिक्कत कहाँ है: विद्यार्थियों के उत्तर वास्तव में सही हैं, लेकिन वे सब आधार 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 के एक्सपोर्ट 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] को आठ बाइट के इस क्रम में लिखेगा।
| 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।