java - math Java查找两个整数之间的中点

  显示原文与译文双语对照的内容

我正在尝试找到两个整数之间的整数中点。 例如 mid(2,3) 将为 2,而不是 2.5. 我有下面的工作,但是我想使用MIN_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;


}



这似乎在x 和y 之间的值从 0到整数,但如果x 是负数,则不正确。

时间: 原作者:

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


public static int mid(int x, int y) {


 return (int) (((long)x + y)/2);


}



那么像这样的?


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不会溢出。

这个怎么样?


public static int mid(int x, int y) {


 return x/2 + y/2 + (x%2 + y%2)/2;


}



原作者:

>> 不同,>>> 运算符填充顶部位,而将符号位扩展到顶部 bits.so 按位运算符>>,这有助于:


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 ( 十进制类型)

while

1111 1111 ( 十进制 -1 )>>> 1 = 0111 1111 ( 十进制类型)

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

我认为这对理解结果很有用;

...