2011-07-28 52 views
6

क्या सी का उपयोग करके अंकगणितीय ऑपरेटरों का उपयोग करके दो संख्याओं को गुणा करना संभव है? बाएं शिफ्ट ऑपरेटर का उपयोग करके, मैं केवल 2 तक किसी भी संख्या को गुणा कर सकता हूं। अन्य नंबरों के बारे में कैसे?अंकगणितीय ऑपरेटरों के बिना सी में गुणा

+2

@ जेन्स गस्टेड हे लेकिन उत्तर स्पष्ट रूप से सही ढंग से उल्लेख नहीं किया गया है !!!!!!!!!!!! – chinchu

+1

@ जेन्स, कोई सवाल दो गुणा के बारे में नहीं है, यह सवाल उससे अधिक सामान्य है। –

+0

[बिटवाई ऑपरेटरों का उपयोग करके दो पूर्णांक का गुणा] (http://stackoverflow.com/q/4456442/995714) –

उत्तर

3
void main() 
{ 
    int n1, n2, n3, n4, x, y, i; 
    printf("Enter first number"); 
    scanf("%d", &n1); 
    printf("Enter second number"); 
    scanf("%d", &n2); 
    n3 = n2; 
    n4 = n2; 
    n1-=1; 
    for(i = n1;i > 0;i-=1) 
    { 
    do { 
     x = n2 & n3; 
     y= n2^n3; 
     n2 = x << 1; 
     n3 = y; 
    } while (x); 
    n2 = y; 
    n3 = n4; 
    } 
    printf("product of two number is %d", y); 
    getch(); 
} 
2

हां यह संभव है। आप इसे तार्किक ऑपरेटरों के साथ कर सकते हैं। आखिरकार, जब आप अंकगणितीय ऑपरेटर का उपयोग करते हैं तो वह हार्डवेयर होता है।

+1

ठीक है अगर आपको दिमाग नहीं है तो आप कोड लिख सकते हैं :-) – chinchu

+1

@chinchu यदि आप अपना करते हैं तो आप क्या सीखेंगे आपके लिए होमवर्क? –

+1

@ डेविड हेफ़र्नन ऐसा कुछ भी नहीं :-) .. मैंने इस के लिए समाधान प्राप्त करने के लिए कई बार कोशिश की..टाला मुझे यहां पूछना है .. :-) – chinchu

5

यह संभव है, एक दिशा के लिए इस विकि देखें: http://en.wikipedia.org/wiki/Binary_multiplier

+0

हालांकि यह जोड़ों का उपयोग करता है? –

+0

आप – MByD

+3

@MByD में एक (पूर्ण) योजक को लागू कर सकते हैं, लेकिन यह इतना भ्रमित – chinchu

10

इस समस्या को हल करने के लिए, पहली बात आप क्या करना चाहते पता लगाने सरल अंकगणितीय आपरेशनों सिर्फ बिटवाइज़ ऑपरेटर्स का उपयोग कर पाने के लिए है।

उदाहरण के लिए, इसके अलावा इस तकनीक

int add(int a, int b) { 
    int c; 
    while (a != 0) { 
     c = b & a; 
     b = b^a; 
     c = c << 1; 
     a = c; 
    } 
    return b; 
} 

का प्रयोग कर प्राप्त किया जा सकता है तो यह इसके अलावा का उपयोग कर गुणा कर की बात है:

int mult(int a, int b) { 
    int i = 0; 
    int c = 0; 
    while (i < b) { 
     c = add(c, a); 
     i = add(i, 1); 
    } 
    return c; 
} 

यह गुणा अभी तक अगर ख नकारात्मक है काम नहीं करता है, लेकिन चूंकि यह होमवर्क समस्या की तरह दिखता है, इसलिए मैं इसे आपके लिए एक अभ्यास के रूप में छोड़ दूंगा। ;)

संपादित करें: जबकि गुणा होने के बाद गुणात्मक अंतर्ज्ञानी है, अतिरिक्त कार्य को समझना इतना आसान नहीं है, इसलिए मैं इसे यहां समझाऊंगा।

मान लीजिए कि आप दो नंबर, 11,010,011 और 10101. करने के लिए हमेशा की तरह जोड़ना चाहते हैं यह बहुत की तरह उन्हें लाइन अप करने के लिए है:

11010011 
+ 10101 

आपको लगता है कि आप दो द्विआधारी संख्या जोड़ने जब ध्यान देंगे, यदि दोनों संख्याओं से ith बिट 1 है, तो परिणामस्वरूप बिट 0 है, और i के बाईं ओर थोड़ा सा है।

यह कैरी कोड स्टोर्स में परिवर्तनीय 'सी' है।

//... 
c = b & a; 
//... 
c << 1; 
//... 

हम बुद्धिमान और ख और एक ही बिट्स जहां दोनों ए और बी हैं 1 पाने के लिए थोड़ा है, तो हम बिट्स कैरी प्राप्त करने के लिए 1 से यह बदलाव छोड़ दिया है।

फिर आप उन बिट्स को देख सकते हैं जहां ए और बी भिन्न होते हैं, यानी बिट्स में से एक 1 है और दूसरा बिट 0 है। इस मामले में परिणामी बिट 1 कैर्री नहीं होगा।

कि क्या इस लाइन स्टोर:

b = b^a; 

अनिवार्य रूप से ऊपर लाइन बिट्स जहां दोनों ए और बी 1 (अब सी में जमा हो जाती है) को हटा।

तो अब आपके पास दो और संख्या बी और सी हैं, जिन्हें आपको एक साथ जोड़ने की आवश्यकता है।

पहले की है, जहां हम पाश

c = a = 00100010 
    b = 11000110 

यह अभी तक पूरी तरह से स्पष्ट नहीं हो सकता है की पहली यात्रा के बाद उदाहरण के साथ पर हैं को देखो, लेकिन ख जिसके परिणामस्वरूप राशि जमा है। लूप के अधिक पुनरावृत्तियों के माध्यम से, अधिक बिट्स को ले जाया जाता है, जिन्हें बी में वापस जोड़ा जाता है, सी में फिर से संग्रहित होता है। उस अर्थ में, आप बिना एक्सर ऑपरेटर के अतिरिक्त एक्स ऑपरेटर के बारे में सोच सकते हैं।

c = a = 00000010 
    b = 11100100 

3 यात्रा:

यहाँ कि पाश की दूसरी यात्रा है

c = a = 00000000 
    b = 11100110 

अब ग (और एक) 0 है, इसलिए वहाँ जोड़ने के लिए कोई अधिक कैरी है। हम लूप से बाहर निकलें और वापस लौटें। ध्यान दें कि भले ही आप लूप जारी रखें, संख्याओं में से कोई भी नहीं बदलेगा।

+1

@ चार्ल्स मा हाय अच्छा समाधान .. आपको बहुत धन्यवाद ... एक गड़बड़ दिन है :-) – chinchu

+1

आपका बहुत स्वागत है:) –

+1

स्पष्ट रूप से स्पष्ट करने के लिए एक बार फिर बहुत धन्यवाद .. :-) – chinchu

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

  • कोई संबंधित समस्या नहीं^_^