Mittelwert von zwei Ints (oder Longs) ohne Überlauf, absteigend auf 0

8

Ich möchte eine Möglichkeit, (x + y)/2 für zwei ganze Zahlen x, y in Java zu berechnen. Die naive Art leidet unter Problemen, wenn x + y & gt; Integer.MAX_VALUE oder & lt; Integer.MIN_VALUE.

Guava IntMath verwendet diese Technik:

%Vor%

... aber dies läuft auf die negative Unendlichkeit zu, was bedeutet, dass die Routine nicht mit der naiven Art für Werte wie {-1, -2} (die -2 statt -1 ergeben) übereinstimmt.

Gibt es eine entsprechende Routine, die in Richtung 0 abschneidet?

"Benutze einfach long " ist nicht die Antwort, nach der ich suche, da ich eine Methode haben möchte, die auch für lange Eingaben funktioniert. BigInteger ist auch nicht die Antwort, nach der ich suche. Ich möchte keine Lösung mit irgendwelchen Zweigen.

    
BeeOnRope 20.04.2013, 01:11
quelle

2 Antworten

2

Sie müssen 1 zum Ergebnis hinzufügen, wenn die niedrigsten Bits unterschiedlich sind (das Ergebnis ist also nicht exakt und Sie müssen runden), und das Vorzeichenbit im Ergebnis wird gesetzt (das Ergebnis ist negativ, also Sie möchte die Abrundung in eine Zusammenfassung umwandeln).

Also sollte folgendes tun (ungetestet):

%Vor%     
starblue 20.04.2013, 16:02
quelle
0

Warum tust du nicht so etwas wie (x-y)/2 + y , das auf x/2 - y/2 + y = x/2 + y/2 reduziert wird? Wenn also x+y einen Überlauf oder Unterlauf liefert, dann machst du den (x-y)/2 + y Weg.

    
Anjoola 20.04.2013 01:21
quelle