当前位置: 首页 > 面试题库 >

无中断的两个整数(或长整数)的平均值,截断为0

雍骏俊
2023-03-14
问题内容

我想要一种计算(x + y)/2Java中任意两个整数x,y的方法。如果x + y>
Integer.MAX_VALUE或<Integer.MIN_VALUE,那么幼稚的方法就会遇到问题。

番石榴IntMath 使用此技术:

  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));
}


 类似资料:
  • 我有3个非常大的有符号整数。 我想计算它们的截断平均值。预期平均值是,即。 不可能计算为: 注:我读了所有关于2个数字的平均值的问题,但我不知道该技术如何应用于3个数字的平均值。 使用BigInteger将非常容易,但假设我不能使用它。 如果我转换为双精度,那么,当然,我会失去精度: 如果我转换为,它可以工作,但也让我们假设我不能使用它。 问题:有没有一种方法可以仅使用长类型来计算3个非常大整数的

  • 问题内容: 以下GO程序给出了错误: 程序: 为什么我不能使用in类型? 问题答案: 更换 通过 引用规范: 当表达式或赋值中混合了不同的数字类型时,需要进行转换。例如,即使int32和int在特定体系结构上可能具有相同的大小,它们也不是同一类型。 Go使用静态类型输入,不会自动在数字类型之间转换。原因可能是为了避免某些错误。例如,应该产生什么值和什么类型?结果应该是吗? ? ?在Go中,这不是问

  • 问题内容: 简单明了,有人知道为什么吗: 返回 220 ,这是正确的结果,并且: 返回 210 ??? 在第二种情况下,我意识到首先要计算220/30,生成一个十进制数(7,333333 …),但仍然…这不是很糟糕的精度吗? 问题答案: 在整数除法和下(注意截断不舍入) 使用非整数可以避免这种情况。例如 或者您可以使用显式

  • 问题内容: 我有一个大小为N *M的矩阵,我想找到每一行的平均值。值是从1到5,并且没有任何值的条目设置为0。但是,当我想使用以下方法查找均值时,它给了我错误的均值,因为它还计算了具有值的条目0。 如何获得仅非零值的均值? 问题答案: 获取每一行的非零计数,并将其用于平均每一行的总和。因此,实现看起来像这样- 如果您使用的是较旧版本的NumPy,则可以使用count的float转换来替换,例如,

  • 希望这对你来说是有意义的,我很乐意更详细地解释这个问题。

  • 我需要写一个程序来计算用户输入的整数的奇偶平均数。用户键入“完成”以完成。输出将显示奇数的平均值和偶数的平均值。 我有一个while循环程序,可以计算数字的和,我正试图增加奇数和偶数和的额外要求。这是代码: 下面是我修改的代码,对奇数和偶数进行排序,然后对每组进行平均。 预期: 实际: