2016-09-30 8 views
0

JAVAで有限フィールドを実装しようとしていますが、2つの2進数をXORする必要があります。ここ は私のコードです:XORがJAVAで予期せぬ出力を出す

  String lastdigits="1000110"; 
      int overflow=11; 
      int lastdigitsint=Integer.parseInt(lastdigits); 
      int result=(int) lastdigitsint^overflow; 

変数「オーバーフロー」の値が11です。 オーバーフロー(= 11)でlastdigitsintをXORするとき、出力は1000101になるはずです。ただし、コードは1095を出力しています。

これはなぜ起こっているのか説明できますか?ありがとうございました。

+1

この例を簡略化し、ハードコードされた値 –

+0

を提供することができます。私はStackOverflowを初めて使うので、ここでもルールを学んでいます。ガイダンスをありがとう! – kudesiaji

+0

また、最小限のコードを編集しました。はい、IntelliJでデバッグしましたが、正しい値が変数lastdigitsおよびoverflowに格納されていることを確認しています。 – kudesiaji

答えて

1

これは最初から間違っている

String lastdigits="1000110"; 
    int lastdigitsint=Integer.parseInt(lastdigits); 

最後の桁の値は1000110になります - 10 houndred百万人と10 thatsのはとてもバイナリ表現は、あなたが期待したものと大きく異なっています。あなたが何をしたいか は単純です:

int lastdigitsint=0b1000110; 

が、これは適切なバイナリ整数です。だから、

public static void main(String[] args) { 
    String lastdigits = "1000110"; 
    int overflow = 0b11; 
    int lastdigitsint = Integer.parseInt(lastdigits); 
    int result = lastdigitsint^overflow; 

    System.out.println("Dec:" + lastdigitsint); 
    System.out.println("Dec:" + overflow); 
    System.out.println("Dec:" + result); 
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint)); 
    System.out.println("Bin" + Integer.toBinaryString(overflow)); 
    System.out.println("Bin" + Integer.toBinaryString(result)); 

    System.out.println("And now the proper way:"); 
    lastdigitsint = 0b1000110; 
    result = lastdigitsint^overflow; 

    System.out.println("Dec:" + lastdigitsint); 
    System.out.println("Dec:" + overflow); 
    System.out.println("Dec:" + result); 
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint)); 
    System.out.println("Bin" + Integer.toBinaryString(overflow)); 
    System.out.println("Bin" + Integer.toBinaryString(result)); 
} 

結果:私には合法的な

Dec:1000110 
Dec:3 
Dec:1000109 
Bin:11110100001010101110 
Bin:11 
Bin:11110100001010101101 
And now the proper way: 
Dec:70 
Dec:3 
Dec:69 
Bin:1000110 
Bin:11 
Bin:1000101 

縫い目。

+0

ありがとうございます。この数字のバイナリ表現が異なる理由を説明してください。 (このコードは他の2進数のために働いているので、私は入力しています。 – kudesiaji

+0

また、lastdigitsintの値をハードコードすることはできません。これは私のプログラム全体のコードの一部にすぎず、String lastdigitsはforループによって生成されています。正しい出力を与える他の方法はありますか? – kudesiaji

+0

問題は11b(3dec)ではなく11dec(1011bin)で排他的論理和をとっていることです。 – Antoniossss

1

あなたはあなたが排他的であると思う数字を排他的にしているわけではありません。あなたは11110100001010100101、その結果、二進数111101000010101011101011をXORしているので、あなたは、11

XORは、これら2つの数のバイナリ表現のビット上で実行されて百万110をXORしている

。興味深いのは、その数字の小数点の表現が1000101であり、これはバイナリの数字100011011をXORした場合の結果のバイナリ表現とまったく同じです。あなたに(バイナリ表現1000101です)進数69を与えるだろう

 String lastdigits="1000110"; 
     int overflow=3; // 11 in binary is 3 in decimal 
     int lastdigitsint=Integer.parseInt(lastdigits,2); 
     int result=(int) lastdigitsint^overflow; 

Decimal  Binary 

1000110 == 11110100001010101110 
          ^
    11 == 00000000000000001011 
      -------------------- 
1000101 == 11110100001010100101 

あなたは二進数100011011をXORしたい場合は、あなたが書く必要があります。

関連する問題