2012-11-20 29 views
7

क्या कोई (किसी भी) समीकरण को बिट-शिफ्ट ऑपरेशंस में परिवर्तित करने का कोई मानक तरीका है? बिट पाली में है, इसलिए अंत समीकरण केवल ऑपरेंड < < होता है, >>, +, और - -बिट-स्थानांतरण संचालन में समीकरणों को परिवर्तित करना

इस करके मैं किसी भी बात यह है कि एक + या नहीं है परिवर्तित मतलब। यह फॉर्मूला कम प्रोसेसर गहन बनाने के हित में है।

स्पष्ट रूप से ये परिणामी समीकरण केवल अनुमानित होंगे, और अधिक ऑर्डर (प्रथम क्रम, द्वितीय क्रम e.t.c) के साथ बेहतर सटीकता प्रदान करते हैं।

मैंने इस पर किसी भी जानकारी के लिए वेब डाला है लेकिन विशिष्ट सूत्रों (पाप, कॉस, inv e.t.c) पर सामान को छोड़कर, कोई भी नहीं मिला है।

मैं बहुपद या टेलर की विस्तार प्रक्रिया की तरह कुछ कल्पना कर रहा था, और उसके बाद इसे बिट-शिफ्ट ऑपरेशंस में परिवर्तित कर रहा था।

उत्तर

3

सिर्फ इसलिए कि आप को सरल निर्देशों को कम कर रहे हैं, इसका मतलब यह नहीं है कि वे तेजी से निष्पादित करने जा रहे हैं या किसी भी तरह से कम गहन हो रहे हैं। जबकि आप कई चीजों को संचालन के कम सबसेट में कम करने में सक्षम हो सकते हैं, तो आपको शायद एक ही कार्य को पूरा करने के लिए कई और संचालन की आवश्यकता होगी। एक प्रोसेसर केवल प्रति सेकंड इतने सारे ऑपरेशन निष्पादित कर सकता है, और आप पहले उसमें भागने जा रहे हैं।

आम तौर पर कम स्तर पर कुछ अनुकूलित करने का प्रयास करते समय, आप अधिक जटिल ऑपकोड का उपयोग करने की कोशिश कर रहे हैं ताकि आपको उनमें से कम की आवश्यकता हो। एक उदाहरण के रूप में, आप कई एडीडी निर्देशों से गुणा कर सकते हैं। लेकिन, उदाहरणों के सबसे छोटे से कुछ भी के लिए, यह एक एमयूएल ओपोड की तुलना में काफी अधिक एडीडी लेने जा रहा है, और इसे निष्पादित करने में काफी समय लगता है।

यद्यपि अपने वास्तविक प्रश्न पर वापस आना ... हालांकि पूरी तरह से दक्षता को अनदेखा कर रहा है, आप तब तक कुछ भी गणना कर सकते हैं जब तक आपके पास निर्देश सेट ट्यूरिंग पूर्ण है। यदि आप सावधान हैं कि आप उस निर्देश को कैसे चुनते हैं, तो आप वास्तव में a single instruction का उपयोग करके कुछ भी गणना कर सकते हैं। मुझे विश्वास नहीं है कि "इन निर्देशों का उपयोग करने में किसी भी मनमाने ढंग से एल्गोरिदम को परिवर्तित करें" कहने का कोई सामान्य उद्देश्य तरीका है, जो आमतौर पर एक कंपाइलर लेखक का काम होता है।

+0

'आमतौर पर एक कंपाइलर लेखक का काम है ... या 'जेनेटिक प्रोग्रामिंग' कार्य के लिए नौकरी :-) –

2

सामान्य रूप से नहीं।

अधिकांश CPUs पर, गुणा अन्य अंकगणितीय परिचालनों की तुलना में काफी धीमी नहीं है, इसलिए गुणा को बदलने के प्रयास में थोड़ा सा उद्देश्य है, दो की निरंतर शक्तियों के गुणा के अलावा।

जहां तक ​​विभाजन हो जाता है, विपरीत में गुणा करके निरंतर गुणा करके विभाजन को परिवर्तित करने के लिए कुछ प्रसिद्ध तरीके हैं, और ये विधियां काफी उत्पादक हैं। कैसे एक स्पष्टीकरण के लिए http://www.flounder.com/multiplicative_inverse.htm देखें। हालांकि, निरंतर मूल्यों के विभाजन को वास्तव में अनुकूलित नहीं किया जा सकता है।

2 शक्ति को बढ़ाने (या 2 की शक्ति से एक संख्या को विभाजित करना), निश्चित रूप से, आसानी से बिट स्थानांतरण में परिवर्तित हो जाता है। अन्य एक्सपोनिएंशन आसानी से परिवर्तित नहीं होते हैं, हालांकि।

अधिकांश अनुवांशिक कार्यों को थोड़ा सा स्तर पर समझदारी से प्रदर्शित नहीं किया जा सकता है। यह मदद नहीं करता है कि अधिकांश को पूर्णांक पर वैसे भी परिभाषित नहीं किया जाता है।

+0

विभाजन के बारे में दिलचस्प, यह हिस्सा उस कोड का सबसे अधिक समय लेने वाला अनुभाग था जिसे मैं चला रहा था एम्बेडेड कॉर्टेक्स-एम 3। उलटा-गुणा करने के लिए बदलना वास्तव में चीजों को बढ़ाया। – gbmhunter

1

बिट-वार ऑपरेशंस के साथ सॉफ़्टवेयर गुणा आधुनिक CPUs पर हार्डवेयर गुणा को हरा करने की संभावना नहीं है।

आमतौर पर बिट-वार मैनिपुलेशन पर जाने से बेहतर प्रदर्शन होता है यदि यह 1) लूप से बचने की अनुमति देता है; और 2) शाखाकरण।

A good online cookbook बिट हैकिंग के लिए। अन्यथा A Hacker's delight है।