2010-05-24 16 views
5

में रेडिक्स सॉर्ट के लिए int से अलग-अलग अंक प्राप्त करने का सबसे अच्छा तरीका रेडिक्स सॉर्ट एल्गोरिदम में उपयोग के लिए अंकों की संख्या के साथ int से अलग अंक प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं सोच रहा हूं कि सी/सी ++ में ऐसा करने का विशेष रूप से अच्छा तरीका है, यदि सामान्य समाधान नहीं है तो क्या?सी/सी ++

संपादित करें: बस स्पष्ट करने के लिए, मैं इसे एक स्ट्रिंग में परिवर्तित करने और अंकों की एक सरणी की तरह व्यवहार करने के अलावा किसी अन्य समाधान की तलाश में था।

उत्तर

6

आकार 2^k के आकार का उपयोग करें। n वें अंकों निकालने के लिए:

#define BASE (2<<k) 
#define MASK (BASE-1) 

inline unsigned get_digit(unsigned word, int n) { 
    return (word >> (n*k)) & MASK; 
} 

पारी और मुखौटा (आधार से सक्षम 2 के एक शक्ति जा रहा है) का उपयोग करना महंगा पूर्णांक-विभाजित निर्देश बचा जाता है।

उसके बाद, सर्वश्रेष्ठ आधार चुनना एक प्रयोगात्मक प्रश्न है (आपके विशेष हार्डवेयर के लिए समय/स्थान व्यापार)। शायद k==3 (आधार 8) अच्छी तरह से काम करता है और बाल्टी की संख्या को सीमित करता है, लेकिन k==4 (आधार 16) अधिक आकर्षक लग रहा है क्योंकि यह शब्द आकार को विभाजित करता है। हालांकि, वास्तव में ऐसे आधार के साथ कुछ भी गलत नहीं है जो शब्द आकार को विभाजित नहीं करता है, और आपको लगता है कि बेस 32 या बेस 64 बेहतर प्रदर्शन करता है। यह एक प्रयोगात्मक प्रश्न है और संभवतः हार्डवेयर द्वारा भिन्न हो सकता है, कैश व्यवहार करता है और आपके सरणी में कितने तत्व हैं।

अंतिम नोट: यदि आप पर हस्ताक्षर कर रहे हैं पूर्णांक जीवन एक बहुत बड़ा दर्द है, क्योंकि आप हस्ताक्षर किए गए सबसे महत्वपूर्ण बिट का इलाज करना चाहते हैं। मैं, अहस्ताक्षरित के रूप में सब कुछ का इलाज करने की सलाह देते हैं, और फिर यदि आप वास्तव में हस्ताक्षर किए की जरूरत है, अपने मूलांक प्रकार के अंतिम चरण में आप बाल्टी स्वैप जाएगा, ताकि एक सबसे महत्वपूर्ण 1 के साथ बाल्टी से पहले एक सबसे महत्वपूर्ण 0. यह समस्या आ निश्चित रूप से है आसान अगर k शब्द का आकार विभाजित करता है।

+0

धन्यवाद। – jordanstephens

3

आधार 10, उपयोग आधार 16.

for (int i = 0; i < 8; i++) { 
    printf("%d\n", (n >> (i*4)) & 0xf); 
} 

के बाद से पूर्णांकों बाइनरी में आंतरिक रूप से जमा हो जाती है का उपयोग न करें, यह 10 से विभाजित दशमलव अंक निर्धारित करने के लिए तुलना में अधिक कुशल हो जाएगा।

+0

शानदार प्रतिक्रिया, मैंने अपने उत्तर की अधिक गहराई के कारण नॉर्मन का चयन किया। विस्तृत प्रतिक्रिया के लिए – jordanstephens

संबंधित मुद्दे