ट्रैक
/
C#
C#
/
अभ्यास
/
हाइपर-ऑप्टिमाइज़्ड टेलीमेट्री
हाइपर-ऑप्टिमाइज़्ड टेलीमेट्री

हाइपर-ऑप्टिमाइज़्ड टेलीमेट्री

सीखने का अभ्यास

परिचय

पूर्णांक संख्याएँ

C# में, कई अन्य स्टैटिक टाइप वाली भाषाओं की तरह, ऐसे कई टाइप होते हैं जो पूर्णांक संख्याओं को दर्शाते हैं, और हर टाइप की वैल्यू की अपनी सीमा होती है। सबसे निचले छोर पर, sbyte टाइप की न्यूनतम वैल्यू -128 और अधिकतम वैल्यू 127 होती है। सभी पूर्णांक टाइप की तरह, ये वैल्यू <type>.MinValue और <type>.MaxValue के रूप में उपलब्ध होती हैं। सबसे ऊपरी छोर पर, long टाइप की न्यूनतम वैल्यू -9,223,372,036,854,775,808 और अधिकतम वैल्यू 9,223,372,036,854,775,807 होती है। इनके बीच में short और int टाइप आते हैं।

ये सीमाएँ टाइप की उस स्टोरेज चौड़ाई से तय होती हैं जो सिस्टम उसे देता है। उदाहरण के लिए, एक byte 8 बिट इस्तेमाल करता है और एक long 64 बिट।

ऊपर दिए गए हर टाइप का एक अनसाइन्ड समकक्ष होता है: sbyte/byte, short/ushort, int/uint और long/ulong। हर मामले में वैल्यू की सीमा 0 से लेकर ऋणात्मक साइन्ड अधिकतम गुणा 2 जमा 1 तक होती है।

टाइप चौड़ाई न्यूनतम अधिकतम
sbyte 8 बिट -128 +127
short 16 बिट -32_768 +32_767
int 32 बिट -2_147_483_648 +2_147_483_647
long 64 बिट -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte 8 बिट 0 +255
ushort 16 बिट 0 +65_535
uint 32 बिट 0 +4_294_967_295
ulong 64 बिट 0 +18_446_744_073_709_551_615

एक टाइप की वेरिएबल (या एक्सप्रेशन) को आसानी से दूसरे टाइप में बदला जा सकता है। जैसे, किसी असाइनमेंट में, अगर असाइन की जा रही वैल्यू का टाइप (lhs) यह सुनिश्चित करता है कि वैल्यू उस टाइप की सीमा के अंदर रहेगी जिसमें असाइन किया जा रहा है (rhs), तो यह एक सीधा असाइनमेंट है:

uint ui = uint.MaxValue;
ulong ul = ui;    // no problem

दूसरी तरफ, अगर जिस टाइप से असाइन किया जा रहा है उसकी सीमा उस टाइप की सीमा का उपसमुच्चय न हो जिसमें असाइन किया जा रहा है, तो कास्ट, यानी () ऑपरेशन ज़रूरी होता है, भले ही वह खास वैल्यू उस टाइप की सीमा के अंदर हो:

short s = 42;
uint ui = (uint)s;

बिट रूपांतरण

BitConverter क्लास पूर्णांक टाइप को बाइट के ऐरे में और बाइट के ऐरे को पूर्णांक टाइप में बदलने का एक आसान तरीका देती है।

निर्देश

रिमोट कंट्रोल कार प्रोजेक्ट पर काम आगे बढ़ रहा है। टेलीमेट्री सिस्टम में बैंडविड्थ बहुत सीमित है, इसलिए आपसे टेलीमेट्री डेटा के आदान-प्रदान के लिए एक मैसेज प्रोटोकॉल बनाने को कहा गया है।

डेटा एक बफर (बाइट ऐरे) में भेजा जाता है। पूर्णांक भेजते समय नीचे बताए गए प्रोटोकॉल का उपयोग करके बफर का आकार घटा दिया जाता है।

हर वैल्यू को सबसे छोटे संभव पूर्णांक टाइप में दर्शाना चाहिए (byte और sbyte टाइप इसमें शामिल नहीं हैं, क्योंकि उनसे बचत बहुत कम होगी):

से तक टाइप
4_294_967_296 9_223_372_036_854_775_807 long
2_147_483_648 4_294_967_295 uint
65_536 2_147_483_647 int
0 65_535 ushort
-32_768 -1 short
-2_147_483_648 -32_769 int
-9_223_372_036_854_775_808 -2_147_483_649 long

वैल्यू को उसके असाइन किए गए टाइप के लिए ज़रूरी बाइट्स की संख्या में बदलना चाहिए। पूरा बफर दो हिस्सों से बनता है: पहला वह बाइट जो बताता है कि बफर में कितने अतिरिक्त बाइट हैं (प्रीफिक्स बाइट), और उसके बाद वे बाइट जिनमें पूर्णांक रखा जाता है (पेलोड बाइट)।

कुछ टाइप बाइट्स की एक ही संख्या इस्तेमाल करते हैं (जैसे uint और int टाइप)। आम तौर पर इनका प्रीफिक्स बाइट एक ही होता, लेकिन तब डिकोड करना मुश्किल हो जाता। इससे बचने के लिए प्रोटोकॉल एक छोटी सी तरकीब लगाता है: साइन वाले टाइपों में प्रीफिक्स बाइट की वैल्यू 256 में से बफर के अतिरिक्त बाइटों की संख्या घटाकर निकलती है।

संचार में सिर्फ प्रीफिक्स बाइट और प्रीफिक्स के बताए अनुसार उसके बाद आने वाले बाइट ही भेजे जाते हैं। अंदरूनी तौर पर भेजने और पाने वाली दोनों रूटीन 9 बाइट का बफर इस्तेमाल करती हैं (ज़रूरत पड़ने पर अंत में शून्य भरकर)।

1. भेजने के लिए तैयार पूर्णांक वैल्यू को एनकोड कीजिए

कृपया TelemetryBuffer.ToBuffer() स्टैटिक मेथड बनाइए, जो उसे दिए गए पैरामीटर को बफर में एनकोड करे।

// Type: ushort, bytes: 2, signed: no, prefix byte: 2
TelemetryBuffer.ToBuffer(5)
// => {0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };

// Type: int, bytes: 4, signed: yes, prefix byte: 256 - 4
TelemetryBuffer.ToBuffer(Int32.MaxValue)
// => {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 };

2. प्राप्त बफर को डिकोड कीजिए

कृपया TelemetryBuffer.FromBuffer() स्टैटिक मेथड बनाइए, जो प्राप्त बफर को डिकोड करके वैल्यू को long के रूप में लौटाए।

TelemetryBuffer.FromBuffer(new byte[] {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 })
// => 2147483647

अगर प्रीफिक्स बाइट की वैल्यू अनपेक्षित हो, तो 0 लौटाया जाना चाहिए।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
C# Exercism

हाइपर-ऑप्टिमाइज़्ड टेलीमेट्री शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।