2011-09-02 11 views
6

केवल जोड़ना, घटाना, और बिट्सफिफ्टिंग का उपयोग करके, मैं किसी दिए गए नंबर से एक पूर्णांक को कैसे गुणा कर सकता हूं?बिट्सफ़िफ्ट किसी भी संख्या से गुणा करने के लिए

उदाहरण के लिए, मैं द्वारा 17.

मुझे पता है कि स्थानांतरण बाईं 2 की एक बहु से गुणा करने और सही स्थानांतरण 2 के एक शक्ति से विभाजित किया जाता है एक पूर्णांक गुणा करने के लिए चाहते हैं, लेकिन मैं कैसे करने के लिए पता नहीं है सामान्यीकृत करें।


नकारात्मक संख्याओं के बारे में क्या? दो के पूरक में कनवर्ट करें और एक ही प्रक्रिया करें?

(संपादित करें: ठीक है, मैं यह मिल गया, कोई बात नहीं आप दो के पूरक में बदल जाएंगे और संख्या दाईं से बाईं ओर के अधिकार के बजाय बाईं से के अनुसार तो आप स्थानांतरण करते।।)


अब मुश्किल हिस्सा आता है। हम केवल 3 ऑपरेटरों का उपयोग कर सकते हैं।

उदाहरण के लिए, 60 से गुणा मैं इस का उपयोग करके पूरा कर सकते हैं:

(x << 5) + (x << 4) + (x << 3) + (x << 2) 

कहाँ x संख्या मैं गुणा कर रहा हूँ। लेकिन यह 7 ऑपरेटर हैं - मैं केवल 3 का उपयोग करने के लिए इसे कैसे जोड़ सकता हूं?

+0

सामान्य गुणा में बदलाव के 3 कार्यों में नहीं किया जा सकता, जोड़ें/घटा देती है ... लेकिन दोनों 17 और 60 3 कार्यों में किया जा सकता है । (संकेत: 60 के लिए एक घटाव आज़माएं) संपादित करें: मैंने नहीं देखा कि यह पहले से ही उत्तर दिया गया था। – Mysticial

+0

उन्होंने समस्याओं को बनाया ताकि आसानी से 3 ऑपरेटर हाहा में काम किया जा सके। पूरी सहायताके लिए शुक्रिया। – Adam

उत्तर

2

जहां तक ​​मुझे पता है, केवल 3 ऑपरेटरों का उपयोग करके सामान्य रूप से गुणा करने का कोई आसान तरीका नहीं है।

60 के साथ गुणा संभव है, के बाद से 60 = 64 - 4: (x << 6) - (x << 2)

+0

मुझे नहीं लगता कि यह सामान्य रूप से 3 संचालन में संभव है। (कोर्स के गुणा निर्देश को छोड़कर) – Mysticial

3

17 = 16 + 1 = (2^4) + (2^0)। इसलिए, अपने नंबर को 4 बिट्स (2^4 = 16 से गुणा करने के लिए) को स्थानांतरित करें, और इसमें मूल संख्या जोड़ें।

इसे देखने का एक और तरीका यह है: 17 बाइनरी (बेस 2) में 10001 है, इसलिए आपको गुणक में निर्धारित प्रत्येक बिट्स (यानी बिट्स 4 और 0, ऊपर के रूप में) के लिए एक शिफ्ट ऑपरेशन की आवश्यकता है।

मुझे सी नहीं पता, इसलिए मैं कोड प्रदान करके खुद को शर्मिंदा नहीं करूंगा।

+0

धन्यवाद। क्या होगा यदि इसके द्वारा गुणा करने के लिए ऋणात्मक संख्या? क्या मैं इसे 2 एस पूरक करता हूं और फिर उस कार्य का उपयोग अपने समारोह/बदलाव करने के लिए करता हूं? – Adam

11

इसे शिफ्ट-एंड-एड कहा जाता है।

http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add

संपादित करें: अपने अन्य सवाल का जवाब करने के लिए, हाँ दो की तारीफ करने के लिए परिवर्तित करने के लिए काम करेंगे विकिपीडिया इस का एक अच्छा व्याख्या है। लेकिन आपको पूरे उत्पाद को पकड़ने के लिए पर्याप्त लंबे समय तक विस्तार करने की आवश्यकता है। (यह मानते हुए कि आप यही चाहते हैं)

EDIT2: यदि दोनों ऑपरेशंस नकारात्मक हैं, तो दोनों ही शुरुआत से ही दोनों की तारीफ करते हैं और आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी।

unsigned int y = (x << 1) + (x << 0); 

(मैं कहाँ संभालने रहा है कि x भी unsigned है):

+0

आपको बहुत मददगार धन्यवाद। – Adam

+0

आपके दूसरे प्रश्न के उत्तर के साथ संपादित किया गया। – Mysticial

5

यहां 3 से गुणा करने का एक उदाहरण है।

उम्मीद है कि आप इसे सामान्यीकृत करने में सक्षम होना चाहिए।

+0

हाँ मैं कर सकता हूं और धन्यवाद। क्या होगा यदि इसके द्वारा गुणा करने के लिए ऋणात्मक संख्या? क्या मैं 2 एस पूरक करता हूं और फिर अपना काम करने के लिए उस नंबर का उपयोग करता हूं? – Adam

संबंधित मुद्दे

 संबंधित मुद्दे