没有溢出的两个 int(或 long)的平均值,向 0 截断

2023-11-26

我想要一种计算方法(x + y)/2对于 Java 中的任意两个整数 x, y。如果 x+y > Integer.MAX_VALUE 或

Guava 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也不是我正在寻找的答案。我不想要任何分支的解决方案。


你需要添加1如果最低位不同(因此结果不精确,需要四舍五入),并且结果中的符号位已设置(结果为负数,因此要将向下舍入更改为向上舍入) )。

所以应该执行以下操作(未经测试):

public static int mean(int x, int y) {
    int xor = x ^ y;
    int roundedDown = (x & y) + (xor >> 1);
    return roundedDown + (1 & xor & (roundedDown >>> 31));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有溢出的两个 int(或 long)的平均值,向 0 截断 的相关文章

随机推荐