2012-05-10 30 views

उत्तर

22

यह नीचे वर्णित दृष्टिकोण का उपयोग करने के लिए 2 की शक्ति होना चाहिए। यह अन्यथा नहीं होना चाहिए।

एक आम दृष्टिकोण "अगर (अनुक्रमणिका> = आकार) {अनुक्रमणिका = आकार - अनुक्रमणिका;}" (10 का आकार, सूचकांक 10, परिणामी अनुक्रमणिका 0 है) जैसा दिखता है। यह धीमा है और निम्नलिखित दृष्टिकोण से संबंधित त्रुटि के लिए प्रवण है। - 31 के रूप में

size = 32 
bin(size) => '00100000' 

mask = size - 1; 
bin(mask) => '00011111' 

एक बिटवाइज़ के साथ इस नकाब को लागू करने और, हम केवल बिट्स कि 0 श्रेणी की संख्याएं शामिल अलग कर सकते हैं:

दो की एक शक्ति का उपयोग करते हुए हमें निम्नलिखित का लाभ लेने के लिए अनुमति देता है सूचकांक बढ़ता है:

index = 4 
bin(4 & mask) => '00000100' (4) 

# index 32 wraps. note here that we do no bounds checking, 
# no manipulation of the index is necessary. we can simply 
# and safely use the result. 
index = 32 
bin(index & mask) => '00000000' (0) 

index = 33 
bin(index & mask) => '00000001' (1) 

index = 64 
bin(index & mask) => '00000000' (0) 

index = 65 
bin(index & mask) => '00000001' (1) 

यह दृष्टिकोण कोई तुलना नहीं, कोई शाखाओं आवश्यकता है, और सुरक्षित (सीमा के भीतर हमेशा सूचकांक जिसके परिणामस्वरूप) है। इसमें जानकारी को कचरा नहीं करने का अतिरिक्त लाभ है; जबकि सूचकांक 65 तत्व 1 को संबोधित करता है, मैं अभी भी जानकारी को बरकरार रखता हूं कि सूचकांक तर्कसंगत रूप से 65 है (जो काफी उपयोगी साबित होता है)।

मैं भी जोड़ने के लिए है कि इस बस के रूप में कुशल है जब यह 3.

मैं जानता हूँ कि मैं पार्टी के लिए देर हो रही है के रूप में जब सूचकांक (बफर में पता 13) 3,456,237 करने के लिए बढ़ता है चाहते हैं, मैं मुझे यह भी यकीन नहीं है कि मुझे यह प्रश्न कैसे मिला :-) उम्मीद है कि इससे मदद मिलती है।