2016-08-24 12 views
5

मैं एक सवाल '+' या के उपयोग के बिना दो पूर्णांकों जोड़ने के लिए अजगर कोड लिखने के बारे में है जो हल करने के लिए कोशिश कर रहा हूँ दो पूर्णांकों जोड़ने - ऑपरेटरों ''। मैं निम्नलिखित कोड है जो दो सकारात्मक संख्या के लिए पूरी तरह से काम करता है:अनंत लूप जबकि अजगर 3 में बिटवाइज़ संचालन का उपयोग कर

def getSum(self, a, b): 

    while (a & b): 
     x = a & b 
     y = a^b 
     a = x << 1 
     b = y 

    return a^b 

कोड का यह टुकड़ा अगर इनपुट दो धनात्मक पूर्णांक या दो नकारात्मक पूर्णांक है के लिए पूरी तरह से काम करता है, लेकिन यह विफल रहता है जब एक नंबर सकारात्मक है और दूसरा नकारात्मक है। यह अनंत लूप में चला जाता है। ऐसा कोई विचार क्यों हो रहा है कि यह क्यों हो रहा है?

+0

'a' और 'b' के लिए आप किस परीक्षण मान का उपयोग कर रहे हैं? लूप के दौरान 'ए' और' बी' के मानों को प्रिंट या देखें - क्या वे दोहराने वाले पैटर्न में आते हैं? साथ ही, क्या इससे कोई फर्क पड़ता है कि 'a' या' b' नकारात्मक ऑपरेंड है या नहीं? – cxw

उत्तर

6

अजगर 3 arbitrary-precision integers ("bignums") है। इसका मतलब है कि कभी भी x नकारात्मक है, x << 1x को नकारात्मक संख्या दो गुणा के साथ बना देगा। दाईं ओर से स्थानांतरित होने वाले शून्यों को संख्या बड़ी और बड़ी संख्या में धक्का देगी।

दो के पूरक में, सकारात्मक संख्या उच्चतम बिट में एक 0 है और नकारात्मक संख्या उच्चतम बिट में एक 1 है। इसका मतलब है कि, जब a का केवल एक और b नकारात्मक है, a और b के शीर्ष बिट्स अलग होगा। इसलिए, x सकारात्मक होगा (1 & 0 = 0) और y नकारात्मक (1^0 = 1) होगा। इस प्रकार नया a सकारात्मक होगा (x<<1) और नया b नकारात्मक होगा (y)।

अब: मनमानी-परिशुद्धता नकारात्मक पूर्णांक वास्तव में कम से कम गणितीय रूप से अग्रणी 1 बिट्स की असीमित संख्या है। तो a एक बड़ा और बड़ा सकारात्मक संख्या है, जो प्रत्येक पुनरावृत्ति 2 तक बढ़ रहा है। b रहता है और अधिक से अधिक अग्रणी हो रही 1 बिट्स a साथ बिटवाइज़ & और ^ बाहर ले जाने के लिए सक्षम हो करने के लिए जोड़ा। इस प्रकार जो कुछ भी a के टुकड़े b का जोड़ा 1 बिट्स में से एक के साथ लाइन चालू हैं, तो a & b हमेशा सच है, तो पाश हमेशा के लिए चलाता है।

+0

आपकी व्याख्या के लिए धन्यवाद। जब मैं संख्याओं को मुद्रित करता था तो यह वही होता था। – Mowgli

+0

इस किनारे के मामले को संभालने के लिए आप इस कोड को किस ट्विक का सुझाव देंगे? – Mowgli

+0

@ मोगली आह! यह एक पूरी तरह से अलग सवाल है :)। गंभीरता से, हालांकि, मैं सुझाव दूंगा कि आप एक नया प्रश्न पोस्ट करें, इस से जुड़ें और पूछें कि "कैसे ठीक करें।" मैंने कभी ऐसा करने के बारे में शिकायत नहीं की है। तो कड़े ध्यान केंद्रित प्रश्नों का मूल्य है, और कौन जानता है? किसी और के साथ आने के मुकाबले बेहतर सुधार हो सकता है। उस प्रश्न के लिंक को यहां एक टिप्पणी में पोस्ट करें और मैं इसे देख लूंगा। – cxw

1

मेरा अनुमान है कि है कि यह एक होमवर्क सवाल यह है, तो मैं बस आप एक समारोह है कि काम करता है --- आप इसके साथ संघर्ष से और जानेंगे देने के लिए नहीं करना चाहती।

समस्या यह है कि नकारात्मक पूर्णांक संग्रहीत किए जाने के तरीके से उत्पन्न होता है। चित्रण प्रयोजनों के लिए, आइए दिखाएं कि आप 4-बिट हस्ताक्षरित पूर्णांक (32-बिट हस्ताक्षरित पूर्णांक के बजाय, या जो भी हो) से निपट रहे हैं। संख्या +1 0001 है। संख्या -1 1111 है। आपको पेन और पेपर के साथ बैठने में सक्षम होना चाहिए और इन दो नंबरों का उपयोग करके मैन्युअल रूप से अपना फ़ंक्शन चलाएं। जवाब, ज़ाहिर है, 0000 होना चाहिए, लेकिन मुझे लगता है कि आप पाएंगे कि इस कोड को पेन और पेपर के साथ काम करके आपके कोड में क्या गलत हो रहा है।

+0

साइट पर आपका स्वागत है, और उत्तर देने के लिए धन्यवाद! मैं मानता हूं कि कर कर सीखना सबसे अच्छा है। जब आप ऑनलाइन हों, तो [टूर] (https://stackoverflow.com/tour) को उस उत्तर में क्या होता है जो अपवॉट प्राप्त करने की संभावना है। का आनंद लें! – cxw

+0

kloppen का जवाब देने के लिए धन्यवाद। मैं कामकाजी कोड कभी नहीं चाहता था। मैं बस यह समझना चाहता था कि क्या हो रहा था। और यह एक होमवर्क सवाल नहीं है। :) – Mowgli

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