Mi piacerebbe un modo per calcolare (x + y)/2
per qualsiasi due interi x, y in Java. Il modo ingenuo soffre di problemi se x + y> Integer.MAX_VALUE o < Integer.MIN_VALUE.Media di due inte (o long) senza overflow, troncata verso 0
Guava IntMath
uses questa tecnica:
public static int mean(int x, int y) {
// Efficient method for computing the arithmetic mean.
// The alternative (x + y)/2 fails for large values.
// The alternative (x + y) >>> 1 fails for negative values.
return (x & y) + ((x^y) >> 1);
}
... ma questo arrotonda verso l'infinito negativo, il che significa la routine non è d'accordo con il modo ingenuo per i valori come {-1, -2} (dando -2, anziché -1).
C'è qualche routine corrispondente che tronca verso 0?
"Basta usare long
" non è la risposta che sto cercando, poiché voglio un metodo che funzioni anche per gli input lunghi. BigInteger
non è la risposta che sto cercando. Non voglio una soluzione con nessun ramo.
* "Non voglio una soluzione con i rami". * - anche se non la migliore soluzione senza rami è più lenta la migliore soluzione con rami ? –
Ecco una soluzione per C++: http://stackoverflow.com/a/3816473/139985. Dovrebbe funzionare anche per Java. –
Hai ragione - se c'è una soluzione con rami che funzionano meglio di una senza ramo su input casuali, sono felice di usarla. Immagino che stia mostrando il mio pregiudizio - dubito che esista una soluzione :) – BeeOnRope