का उपयोग कर पूर्णांक विभाजन निष्पादित करें एक कंपाइलर द्वारा उत्पादित x86 असेंबली को देखते हुए, मैंने देखा कि (हस्ताक्षरित) पूर्णांक डिवीजन कभी-कभी पूर्णांक गुणों के रूप में कार्यान्वित किए जाते हैं। इन अनुकूलन प्रपत्रगुणा
value/n => (value * ((0xFFFFFFFF/n) + 1))/0x100000000
उदाहरण के लिए पालन करने के लिए, 9 से एक प्रभाग प्रदर्शन लगते हैं:
12345678/9 = (12345678 * 0x1C71C71D)/0x100000000
3 से एक प्रभाग इतने पर 0x55555555 + 1
साथ गुणा का प्रयोग करेंगे, और।
इस तथ्य का पता लगाना कि mul
निर्देश edx
रजिस्टर में परिणाम के उच्च भाग को संग्रहीत करता है, विभाजन का अंतिम परिणाम जादू मूल्य के साथ एक गुणा का उपयोग करके प्राप्त किया जा सकता है। (हालांकि इस ऑप्टिमाइज़ेशन को कभी-कभी अंत में बिट-वार शिफ्ट के संयोजन के साथ प्रयोग किया जाता है।)
मुझे कुछ अंतर्दृष्टि चाहिए कि यह वास्तव में कैसे काम करता है। यह दृष्टिकोण कब वैध है? हमारे "जादू संख्या" में 1 क्यों जोड़ा जाना चाहिए?
निरंतर जो आप गुणा करते हैं वह पारस्परिक का अनुमान है। यहां यादृच्छिक +/- 1 है और यह सुनिश्चित करना है कि यह हमेशा "गोल" हो। यह साबित करना कि एक विशेष विधि सही है या तो गणितीय रूप से या सभी संख्याओं के ब्रूट-बल परीक्षण द्वारा किया जा सकता है। (32-बिट के लिए, यह पूरी तरह से व्यवहार्य है।) – Mysticial
@ मिस्टिकियल: यह मेरे उत्तर की तरह दिखता है। –
@ScottHunter शायद बाद में जब मैं काम से बाहर हूं। मेरे पास व्यापक उत्तर देने के लिए यहां बहुत सारे टूल नहीं हैं। – Mysticial