चलिए एक पल के लिए आधे कार्य के बारे में सोचें - एक स्ट्रिंग-ized बेस एन से हस्ताक्षरित लंबे समय तक कनवर्ट करना, जहां एन 2 की शक्ति है (बाइनरी के लिए आधार 2 और हेक्स के लिए आधार 16)।
यदि आपका इनपुट सचेत है, तो यह काम तुलना, एक घटा, एक शिफ्ट और प्रति अंक से अधिक कुछ नहीं है। यदि आपका इनपुट सचेत नहीं है, तो, वह वही है जहां यह बदसूरत हो जाता है, है ना? रूपांतरण superfast करना मुश्किल नहीं है। सभी परिस्थितियों में इसे अच्छी तरह से करना चुनौती है।
unsigned long PowerOfTwoFromString(char *input, int shift)
{
unsigned long val = 0;
char upperLimit = 'a' + (1 << shift)
while (*input) {
char c = tolower(*input++);
unsigned long digit = (c > 'a' && c < upperLimit) ? c - 'a' + 10 : c - '0';
val = (val << shift) | digit;
}
return val;
}
#define UlongFromBinaryString(str) PowerOfTwoFromString(str, 1)
#define UlongFromHexString(str) PowerOfTwoFromString(str, 4)
देखें है कि कितना आसान:
तो चलो मान लेते हैं कि अपने इनपुट समझदार है करते हैं, तो आपके रूपांतरण के दिल है? और यह गैर-सना इनपुट पर असफल हो जाएगा। आपका अधिकांश काम आपके इनपुट कोने में प्रदर्शन करने जा रहा है, प्रदर्शन नहीं।
अब, यह कोड दो स्थानांतरण की शक्ति का लाभ उठाता है। बेस 4, बेस 8, बेस 32 इत्यादि तक विस्तार करना आसान है। यह दो अड्डों की गैर-शक्ति पर काम नहीं करेगा। उन लोगों के लिए, आपके गणित को बदलना है। आपको
val = (val * base) + digit
जो संचालन के इस सेट के लिए अवधारणात्मक रूप से समान है। आधार द्वारा गुणा शिफ्ट के बराबर होने जा रहा है। तो मैं इसके बजाय एक पूरी तरह से सामान्य दिनचर्या का उपयोग करने की संभावना होगी। और इनपुट को स्वच्छ करते समय कोड को स्वच्छ करें। और उस समय, स्ट्रेटोल शायद आपकी सबसे अच्छी शर्त है। स्ट्रेटल के a version का लिंक यहां दिया गया है। लगभग सभी काम बढ़त की स्थिति को संभालने में कामयाब रहे हैं - आपको उस पर ध्यान देना चाहिए जहां आप ऊर्जा को केंद्रित करना चाहिए: सही, लचीला कोड। बिट बदलावों का उपयोग करने के लिए बचत कम बचत पर दुर्घटनाग्रस्त नहीं होने की बचत की तुलना में न्यूनतम होने जा रही है।
आप पहले दो फ़ंक्शन नाम हैं बेहद भ्रामक हैं। आप एक दशमलव प्रतिनिधित्व वापस नहीं कर रहे हैं। आप एक अपरिभाषित, अपारदर्शी (जब तक आप कुछ कार्यान्वयन-परिभाषित नहीं करते) आंतरिक प्रतिनिधित्व के साथ एक हस्ताक्षरित लंबे समय तक लौट रहे हैं। –
आप फ़ंक्शन नामों का प्रस्ताव क्या करेंगे? –
Binary2Int और Hex2Int एक बहुत अधिक समझ में आता है बेशक इन कार्यों ग पुस्तकालय में strtol साथ अनावश्यक हैं – jmucchiello