2017-01-25 26 views
1

私は2つの整数間の整数の中間点を見つけようとしています。たとえば、mid(2,3)は2.5ではなく2になります。私はうまく動作する以下を持っていましたが、私はMIN_VALUEからMAX_VALUEまでの数値で作業したいと思います。 xが負の数の場合はJavaは2つの整数間の中点を見つける

これにInteger.MAX_VALUEまで0からxとyの値のために働くようだ
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; 
} 

、しかし間違っていると私は」:

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

私は今持っていますなぜそれが分かりませんか?あなたが長い間に変換して回避し、バックアップすることができます

+0

'x + y> MAX_VALUE'の場合にも動作しません。 – molbdnilo

+1

'double'でそれを行い、intに変換し直しますか? 'int'sを' long's'sを最初に宣伝しますか? – markspace

+0

負の整数で誤った動作を再現できません。私が確認できる唯一のことは、このコードがオーバーフロー問題の影響を受けることです。 – Paul

答えて

1

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

'(long)x + y'はまだ整数をオーバーフローできませんか? –

+0

いいえ、キャスト演算はlong – Jerry06

+1

になります。算術演算(+、 - 、*、/、%)の値のいずれかが長い場合、算術演算が実行される前にすべての値がlong型に変換されます。 (long)x + y)/ 2は 'long'を返すが' int 'の範囲にあるので、 'int'へのキャストは' long'を返します。 – Jerry06

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その後、大きい場合にあなたがオーバーフローしないように長いにキャストする必要があります。 >>ビット単位の演算bits.so上部に符号ビットを拡張したが>>有用であるとは異なり

0

>>>演算子は、ゼロと上部ビットを埋める: 1111 1110:例えば

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

(小数-2)1111 1111 + 0000 0001(小数点以下1)=(小数-1)(小数-1)>> 1 = 1111 1111

1111 1111(小数-1)

一方

1111 1111私はこれを理解するのに有用かもしれないと思う(小数-1)>>> 1 = 0111 1111(十進数127)

(Java型 '整数' は単に例示するためにここでは、4バイト)

結果;

+0

私は今これらの演算子の違いを参照してくださいが、>>でもオーバーフローがあるようです。 Integer.MAX_VALUEとInteger.MAX_VALUEの中間はIntegerでなければなりません。MAX_VALUEは-1ですが、中間(MIN_VALUE、MIN_VALUE)は0を表示しています。 – user7466895

+0

あなたは 'int midpoint =(x >> 1)+(y >> 1);'もちろん、Integer.MAX_VALUEとInteger .MAX_VALUEはInteger.MAX_VALUE - 1 –

+0

私はhavaが答えを編集しました。 '(x&0b1)/ 0b1'は最後のビットコードを取得することです –

1

これはどうですか。

public static int mid(int x, int y) { 
    return x/2 + y/2 + (x%2 + y%2)/2; 
} 
関連する問題