क्या सी का उपयोग करके अंकगणितीय ऑपरेटरों का उपयोग करके दो संख्याओं को गुणा करना संभव है? बाएं शिफ्ट ऑपरेटर का उपयोग करके, मैं केवल 2 तक किसी भी संख्या को गुणा कर सकता हूं। अन्य नंबरों के बारे में कैसे?अंकगणितीय ऑपरेटरों के बिना सी में गुणा
उत्तर
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();
}
हां यह संभव है। आप इसे तार्किक ऑपरेटरों के साथ कर सकते हैं। आखिरकार, जब आप अंकगणितीय ऑपरेटर का उपयोग करते हैं तो वह हार्डवेयर होता है।
यह संभव है, एक दिशा के लिए इस विकि देखें: http://en.wikipedia.org/wiki/Binary_multiplier
इस समस्या को हल करने के लिए, पहली बात आप क्या करना चाहते पता लगाने सरल अंकगणितीय आपरेशनों सिर्फ बिटवाइज़ ऑपरेटर्स का उपयोग कर पाने के लिए है।
उदाहरण के लिए, इसके अलावा इस तकनीक
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 है, इसलिए वहाँ जोड़ने के लिए कोई अधिक कैरी है। हम लूप से बाहर निकलें और वापस लौटें। ध्यान दें कि भले ही आप लूप जारी रखें, संख्याओं में से कोई भी नहीं बदलेगा।
@ जेन्स गस्टेड हे लेकिन उत्तर स्पष्ट रूप से सही ढंग से उल्लेख नहीं किया गया है !!!!!!!!!!!! – chinchu
@ जेन्स, कोई सवाल दो गुणा के बारे में नहीं है, यह सवाल उससे अधिक सामान्य है। –
[बिटवाई ऑपरेटरों का उपयोग करके दो पूर्णांक का गुणा] (http://stackoverflow.com/q/4456442/995714) –