Unendliche Schleife beim Hinzufügen von zwei Integern mit bitweisen Operationen in Python 3

Ich versuche, eine Frage zu lösen, die über das Schreiben von Python-Code für das Hinzufügen von zwei Integern ohne die Verwendung von '+' oder '-' Operatoren ist. Ich habe den folgenden Code, der perfekt für zwei positive Zahlen funktioniert:

def getSum(self, a, b): while (a & b): x = a & b y = a ^ b a = x << 1 b = y return a ^ b 

Dieses Stück Code funktioniert perfekt, wenn Eingang zwei positive ganze Zahlen oder zwei negative ganze Zahlen ist, aber es scheitert, wenn eine Zahl positiv ist und andere negativ ist. Es geht in die Endlosschleife. Irgendeine Idee, warum dies geschehen könnte?

2 Solutions collect form web for “Unendliche Schleife beim Hinzufügen von zwei Integern mit bitweisen Operationen in Python 3”

Python 3 hat beliebig-präzise ganze Zahlen ("bignums") . Dies bedeutet, dass x immer negativ ist, x << 1 wird x eine negative Zahl mit doppelter Größe. Nullen, die sich von rechts bewegen, drücken einfach die Zahl größer und größer.

In zwei Komplementen haben positive Zahlen eine 0 im höchsten Bit und negative Zahlen haben eine 1 im höchsten Bit. Das bedeutet, dass, wenn nur einer von a und b negativ ist, die oberen Bits von a und b unterscheiden. Daher ist x positiv ( 1 & 0 = 0 ) und y wird negativ ( 1 ^ 0 = 1 ). So wird das neue a positiv sein ( x<<1 ) und das neue b wird negativ sein ( y ).

Nun: Willkürliche Präzision negative Ganzzahlen haben tatsächlich eine unendliche Anzahl von führenden 1 Bits, zumindest mathematisch. So ist a eine größere und größere positive Zahl, die um 2 jede Iteration erweitert wird. b bekommt immer mehr und mehr führende 1 Bits hinzugefügt, um in der Lage sein, die bitweise & und ^ mit a durchzuführen. Also, was Bits von a sind auf Line-Up mit einem der zusätzlichen 1 Bits von b , so a & b ist immer wahr, so dass die Schleife läuft für immer.

Ich vermute, dass dies eine Hausaufgabe Frage ist, also möchte ich nicht nur geben Sie eine Funktion, die funktioniert – Sie werden mehr lernen, indem Sie mit ihm zu kämpfen.

Das Problem ergibt sich aus der Art, wie negative ganze Zahlen gespeichert werden. Zur Veranschaulichung wollen wir vorgeben, dass es sich um 4-Bit-Ganzzahl-Integer handelt (anstelle von 32-Bit-Zeichen ganz oder gar nicht). Die Zahl +1 ist 0001. Die Zahl -1 ist 1111. Sie sollten in der Lage sein, sich mit einem Stift und Papier zu setzen und manuell laufen Sie Ihre Funktion mit diesen beiden Zahlen. Die Antwort, natürlich, sollte 0000 sein, aber ich denke, Sie werden entdecken, was los ist mit Ihrem Code durch die Arbeit dieser vereinfachten Fall mit einem Stift und Papier.

  • 'ManyRelatedManager' Objekt hat kein Attribut 'Produkt'
  • Wie installiere ich ipython qtconsole mit pyenv (Python Version 3.4.2)
  • Bei der Verwendung von jenkins API, bekommen einen Fehler auf reconfig_job
  • Wie man CGI "hallo Welt" mit python http.server ausführt
  • Ersetzen Sie mehrere Texte mit ihren entsprechenden Texten in XML mit Python - Teil 2 -
  • Erhalte den Dateipfad von der askopenfilename-Funktion in Tkinter
  • String-Index außerhalb des Bereichs beim Lesen der Textdatei
  • Python 3 Liste: Wie stelle ich [('NJ', 81), ('CA', 81), ('DC', 52)] Basis auf Nummer und dann Briefe?
  • Wie füge ich eine neue Zeile in einer Textdatei mit python ohne \ n hinzu
  • ValueError: Tag ist außerhalb des Bereichs für Monat datetime
  • Verwenden Sie Regex, um Informationen aus einem bestimmten Textformat zu erhalten
  • Python ist die beste Programmiersprache der Welt.