java 求int平均值防止溢出

22 篇文章 3 订阅
10 篇文章 0 订阅

方法1

start + (end - start) / 2

方法2

int mid = (start + end) >>> 1

它通过移位实现了除以 2,但。。。这样难道不会导致溢出吗?

首先大家可以补一下 补码 的知识。

其实问题的关键就是这里了>>> ,我们知道还有一种右移是>>。区别在于>>为有符号右移,右移以后最高位保持原来的最高位。而>>>这个右移的话最高位补 0。

所以这里其实利用到了整数的补码形式,最高位其实是符号位,所以当 start + end溢出的时候,其实本质上只是符号位收到了进位,而>>>这个右移可以带着符号位右移,所以之前的信息没有丢掉。

但>>有符号右移就会出现问题了,事实上 JDK6 之前都用的>>

 

方法3

1、将相同的位进行相加,结果等于两数按位与的结果的两倍;(0+0)/2=0  (1+1)/2=1
2、将不同的位进行相加,其结果等于按位异或的结果。(0^1)=1 >>1=0.5

代码如下:
 

public static int mean(int a, int b){
    return (x & y) + ((x ^ y) >> 1);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,计算一组实数(浮点数)的平均值可以通过遍历数组并对所有数值和,然后除以元素数量来实现。以下是一个简单的示例: ```java import java.util.ArrayList; public class AverageCalculator { public static double calculateAverage(double[] numbers) { if (numbers == null || numbers.length == 0) { throw new IllegalArgumentException("Array is empty or null"); } double sum = 0; for (double number : numbers) { sum += number; } return sum / numbers.length; } public static void main(String[] args) { // 示例数据 double[] realNumbers = {1.5, 2.7, 3.8, 4.9, 5.1}; double average = calculateAverage(realNumbers); System.out.println("The average of the numbers is: " + average); } } ``` 在这个例子中,`calculateAverage`方法接收一个`double`类型的数组作为参数,计算数组中所有元素的总和,然后返回平均值。`main`方法中,我们创建了一个包含5个实数的数组,并调用`calculateAverage`方法计算平均值。 如果你想要用户输入多个数字,可以使用Scanner类来动态获取,例如: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter a series of numbers separated by spaces:"); String input = scanner.nextLine(); String[] numberStrings = input.split(" "); double[] numbers = new double[numberStrings.length]; for (int i = 0; i < numberStrings.length; i++) { numbers[i] = Double.parseDouble(numberStrings[i]); } double average = calculateAverage(numbers); System.out.println("The average of the numbers is: " + average); scanner.close(); } } ``` 这里用户输入一串用空格分隔的数字,程序会将这些字符串转换为double类型并计算平均值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值