Java找到两个整数之间的中点

时间:2017-01-25 03:12:44

标签: java math integer-overflow

我试图找到两个整数之间的整数中点。例如,mid(2,3)将是2,而不是2.5。我有以下工作正常,但我想使用从MIN_VALUE到MAX_VALUE的数字,这样做会导致溢出,所以完全不正确的结果。

public static int mid(int x, int y){
    int midpoint =  (x+y)/2;
    return midpoint;
}

我现在有了:

public static int mid(int x, int y){
    int low = Math.min(x, y);
    int high = Math.max(x, y);
    int midpoint =  (low + high) >>> 1;
    return midpoint;
}

这似乎适用于从0到Integer.MAX_VALUE的x和y的值,但如果x是负数,则不正确,我不确定为什么会这样?

4 个答案:

答案 0 :(得分:2)

这个怎么样?

public static int mid(int x, int y) {
   return x/2 + y/2 + (x%2 + y%2)/2;
}

答案 1 :(得分:1)

您可以使用转换为long和back:

public static int mid(int x, int y) {
    return (int) (((long)x + y) / 2);
}

答案 2 :(得分:1)

这样的事情怎么样?

public static int mid(int x, int y){
    long difference = (long)y - x;
    long adDiff = difference/2;
    return (long) (x + adDiff);
}

你必须把它强制转换为长,以便在y-x大于MAX {VALUE的情况下你不会溢出。

答案 3 :(得分:0)

a>>>运算符用零填充顶部位,与>>不同它将符号位扩展到顶部位。按位运算符>>很有帮助:

public static int mid(int x, int y){
   int midpoint =  (x>>1) + (y>>1);

    if((x&0b1)/0b1==1&&(y&0b1)/0b1==1){
        midpoint++;
    }

    return midpoint;
}

例如: 1111 1110(十进制-2)+ 0000 0001(十进制1)= 1111 1111(十进制-1)

1111 1111(十进制-1)>> 1 = 1111 1111(十进制-1)

,而

1111 1111(十进制-1)>>> 1 = 0111 1111(十进制127)

(java类型'Integer'是4个字节,这里只是为了说明)

我认为这可能有助于理解结果;