我试图找到两个整数之间的整数中点。例如,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是负数,则不正确,我不确定为什么会这样?
答案 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个字节,这里只是为了说明)
我认为这可能有助于理解结果;