आकार 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
शब्द का आकार विभाजित करता है।
स्रोत
2010-05-24 03:45:58
धन्यवाद। – jordanstephens