Chciałbym sposób obliczyć (x + y)/2
dla dowolnych dwóch liczb całkowitych x, y w Javie. W naiwny sposób występują problemy, jeśli x + y> Integer.MAX_VALUE lub < Integer.MIN_VALUE.Znaczenie dwóch int (lub longs) bez przepełnienia, obcięcie w kierunku 0
Guava IntMath
uses tej techniki:
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);
}
... ale zaokrągla do minus nieskończoności, to znaczy procedura nie zgadza się z naiwnych sposób jak dla wartości {-1, -2} (dając -2, zamiast -1).
Czy istnieje odpowiednia procedura, która skraca się w kierunku 0?
"Po prostu użyj long
" nie jest odpowiedź, której szukam, ponieważ chcę metodę, która działa również dla długich danych wejściowych. BigInteger
również nie jest odpowiedzią, której szukam. Nie chcę rozwiązania z żadnymi oddziałami.
* „Nie chcę rozwiązanie z wszelkich branż.” * - nawet jeśli branchless najlepszym rozwiązaniem jest wolniejszy niż najlepszego rozwiązania z oddziałów ? –
Oto rozwiązanie dla C++: http://stackoverflow.com/a/3816473/139985. Powinien również działać w Javie. –
Masz rację - jeśli istnieje rozwiązanie z odgałęzieniami, które działa lepiej niż bezlistne na losowym wprowadzaniu, cieszę się, że go używam. Wydaje mi się, że pokazywałem swoje uprzedzenia - wątpię, żeby takie rozwiązanie istniało :) – BeeOnRope