Wie kann man zwei long
-Werte in Java hinzufügen, so dass, wenn das Ergebnis überläuft, es in den Bereich Long.MIN_VALUE
.. Long.MAX_VALUE
?
Zum Hinzufügen von Ints kann die Arithmetik in long
precision ausgeführt werden und das Ergebnis zurück in int
, z. B.:
oder
%Vor% aber im Fall von long
gibt es keinen größeren primitiven Typ, der die Zwischensumme (nicht geklammert) halten kann.
Da dies Java ist, kann ich nicht Inline-Assembly verwenden (insbesondere die gesättigten Add-Anweisungen von SSE) .)
Er kann mit BigInteger
, z. B.
Die Leistung ist jedoch wichtig, daher ist diese Methode nicht ideal (obwohl sie zum Testen nützlich ist).
Ich weiß nicht, ob das Vermeiden von Verzweigungen die Leistung in Java erheblich beeinträchtigen kann. Ich gehe davon aus, dass es möglich ist, aber ich möchte Methoden mit und ohne Verzweigung vergleichen.
Related: Wie Sättigung Zugabe in C tun?
Sie sollten es anhand des Vorzeichens der Zahlen in vier Fälle unterteilen können: Wenn eine der Zahlen Null ist, lautet die Antwort die andere Zahl. Wenn man positiv und ein anderes negativ ist, dann kann man nicht über- oder unterlaufen. Wenn beide positiv sind, können Sie nur überlaufen. Wenn beide negativ sind, können Sie nur unterlaufen.
Machen Sie in den letzten beiden Fällen eine zusätzliche Berechnung, um zu sehen, ob dies zu dem unerwünschten Fall führt:
%Vor%Sie können auch den eingebauten Sättigungsmechanismus von Typcasting verwenden:
%Vor% x
und y
werden als double
hinzugefügt und das Umwandeln in int
wird in den Bereich [Integer.MIN_VALUE, Integer.MAX_VALUE]
gesättigt.
Dies ist nicht so geeignet für long
s, da die Genauigkeit von double
geringer ist als die von long
, aber wenn die Genauigkeit nicht so wichtig ist, wird es ausreichen.
Tags und Links java math bit-manipulation signal-processing integer-overflow