2016-12-01 8 views
-1

何らかの理由で、次の2つのビット単位の演算で異なる結果が得られますが、使用するマスクが同じである必要があるため、同じ結果が得られるはずです。私はここで何が欠けていますか?なぜ2つのマスクを使用した結果が異なるのですか?生産ビット単位の演算子の出力の差

public class BitShiftTest { 

    private long bitString = -8784238533840732024L ; 
    private final int MAX_BITS_POSITION = 63 ; 

    public static void main(String[] args) { 
     BitShiftTest bst = new BitShiftTest() ; 
     System.out.printf("Before applying mask: %s\n", Long.toBinaryString(bst.bitString)); 
     System.out.printf("Using Mask 1: %s\n", Long.toBinaryString(bst.clearBitMask(60))); 
     System.out.printf("Using Mask 2: %s\n", Long.toBinaryString(bst.clearBitMaskAlternative(60))); 
    } 

    public long clearBitMask(int position) { 
     return bitString & ~(1 << position) ; 
    } 

    public long clearBitMaskAlternative(int position) { 
     return bitString & (0x8000000000000000L >>> MAX_BITS_POSITION - position) ; 
    } 
} 

結果は

Before applying mask: 1000011000011000000111011001100000101000001000000000000010001000 
Using Mask 1: 1000011000011000000111011001100000101000001000000000000010001000 
Using Mask 2: 0 
+3

あなたが最初に 'bitString'を変更しないでくださいコール? – qxz

+0

申し訳ありません。私は、 'clearBitMask ...'関数のビットストリングの修正を取り除いていたはずですが、私はまだまだ同じ結果になっています – reayn3

+0

正確な結果は? – RealSkeptic

答えて

0

あなたが~(1<<position)0x8000000000000000L >>> MAX_BITS_POSITION - positionが等しいと仮定されているのですが、それは真実ではありません。

基本的には、別のケースでは~がありません。そうでなければ、1ビットだけを抽出しようとしているかのように見えます。

~(0x8000000000000000L >>> MAX_BITS_POSITION - position) 

しかし@RolandIllig 1 << positionで述べたようにも、実際にはint型の演算で行われている:それはする必要があります。あなたが出力しているものは見えません。あなたがマスキングしている間、60番目と28番目のビットは設定されていないからです。 1L << positionがこれを修正します。

+0

いいですよ!実際には、マスクが同様のデータ型に対して使用されている場合、 '〜(1 << position)'は '(0x8000000000000000L >>>(MAX_BITS_POSITION-position))'と同等でなければなりません。 – reayn3

+0

@Andyあなたは優先順位が間違っています。 –

+0

ありがとう@RolandIllig。マスクに '1L'を使用すると、それがソートされるように見えます。 – reayn3

0

1 << 63は、タイプがintであるため、1が数字からシフトされるため、Integer.MIN_VALUEに等しくなります。 (あなたがint以上のビットでいるシフトするので、他の言語では結果が不定にされるだろう。

この問題を解決するには、1L << 63を使用し、long上で動作する。

+0

Thanks Roland。 'bitString&〜(1L << position)'を使うと、 'bitString&〜(1 << position)'は期待した結果が得られません。しかし、 'bitString&(0x8000000000000000L >>>(MAX_BITS_POSITION-position))'は 'bitString&〜(1L << position)と似ているにもかかわらず不正な値を返す' – reayn3

+1

['1 << 63 「間違っている」(http://ideone.com/jOU7Zz)。しかし、これはとにかく計算されていません! –

+0

@Andyありがとう、私はそれを修正しました。 –

関連する問題