我想要一种方法来计算(x + y)/2
任何两个整数x,y在Java中。如果x + y> Integer.MAX_VALUE或< Integer.MIN_VALUE,那么天真的方式会遇到问题。平均两个整数(或长)没有溢出,截断为0
番石榴IntMath
uses这种技术:
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);
}
...但是这轮向负无穷,这意味着常规不与天真的方式达成一致值如{-1,-2}(给-2,而不是-1)。
是否有任何相应的程序截断为0?
“只是使用long
”不是我正在寻找的答案,因为我想要一个适用于长输入的方法。 BigInteger
也不是我要找的答案。我不想要任何分支机构的解决方案。
*“我不想与任何分支机构的解决方案。” * - 甚至,如果最好的网点解决方案比设有分支机构的最佳解决方案慢? – 2013-04-20 01:23:30
以下是C++的解决方案:http://stackoverflow.com/a/3816473/139985。它也应该适用于Java。 – 2013-04-20 01:34:43
你说得对 - 如果分支机构的解决方案比随机输入的分支机构性能更好,我很乐意使用它。我想我显示了我的偏见 - 我怀疑这样的解决方案存在:) – BeeOnRope 2013-04-20 01:35:53