यह सरणी आकार मुझे लगता है तो इसके दो कारण हैं, जिनके चलते दो की शक्तियों इष्ट हैं की बात आती है। एक - जैसा कि यहां कई उत्तरों से प्रमाणित है - क्या प्रोग्रामर जो नहीं जानते कि "हुड के नीचे" क्या हो रहा है, ऐसा लगता है कि यह किसी भी तरह की शक्ति का उपयोग करने के लिए और अधिक कुशल हो सकता है। दूसरा चक्रीय बफर के साथ करने के लिए (ज्यादातर ऐतिहासिक) है।
चक्रीय बफर जो दो की शक्तियां हैं, मास्क का उपयोग करके अधिक आसानी से और तेज़ी से संभाला जा सकता है, सामान्य रूप से धीमे मॉड्यूलो ऑपरेशन या शाखाओं की आवश्यकता वाले परिस्थितियों का उपयोग करने के बजाए पढ़ने और लिखने के सूचकांक (या पॉइंटर्स) पर जा सकते हैं। यह पुरानी मशीनों पर महत्वपूर्ण था लेकिन बड़ी मात्रा में डेटा स्थानांतरित करने के लिए अभी भी महत्वपूर्ण हो सकता है - उदा। ग्राफिक्स प्रोसेसिंग
उदाहरण के लिए, सी में, एक चक्रीय बफर में पढ़ने के लिए उपलब्ध बाइट्स की संख्या से प्राप्त किया जा सकता:
pending = (SIZE + wr - rd) & (SIZE - 1);
दो की शक्ति का उपयोग नहीं तो बराबर होगा:
pending = (SIZE + wr - rd) % (SIZE - 1);
मशीनों है कि एक प्रभाग/मापांक अनुदेश लागू नहीं है कि छोटी "%" कई सौ चक्र का समय लग सकता है, तो आप की तरह कुछ की आवश्यकता होगी पर:
if (wr >= rd)
pending = wr - rd;
else
pending = (SIZE + wr) - rd;
कौन सा कोड बंद करता है और ब्रांचिंग का कारण बनता है जो निर्देश पाइपलाइन को रोक सकता है।
बफर जो था जैसे
buf[wr++] = x;
if (wr == SIZE)
rd = 0;
कुछ (आमतौर पर) और अधिक कुशल हो जाता है लेखन:
buf[wr++] = x;
wr &= SIZE-1;
बेशक
अगर आप सूचकांक एक 256 प्रविष्टि सरणी के लिए एक अहस्ताक्षरित 8 बिट चर इस्तेमाल किया तो आपको मास्किंग करने की भी आवश्यकता नहीं थी।
मुझे नहीं लगता कि बिना किसी प्रश्न के निरंतर उपयोग किए जाने के सवाल का उत्तर दिया जा सकता है। स्थिरता का उद्देश्य यह निर्धारित करता है कि निरंतर मान क्या मान सकते हैं। –
एक उदाहरण इंक की एक सरणी का आकार हो सकता है। –
मुझे लगता है कि आप सोच रहे हैं कि हम वास्तव में उपयोग किए जाने से 2 की शक्तियों का उपयोग करते हैं। लोग 256 की सरणी के समान 100 इन्स की सरणी का उपयोग करेंगे। बिटमास्किंग 2 की शक्तियों का मुख्य कारण है, और यह सरणी के आकार पर लागू नहीं होता है। –