0

Java で有限フィールドを実装しようとしていますが、そのためには 2 つの 2 進数を XOR する必要があります。これが私のコードです:

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

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

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

4

2 に答える 2

1

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

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

最後の桁の値は 1000110 になります。これは1000 万と 10 であるため、バイナリ表現は予想とは大きく異なります。あなたがしたいことは単純です:

int lastdigitsint=0b1000110;

これは適切な 2 進整数です。

そう:

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

縫い目は私にとって合法です。

于 2016-09-30T18:57:20.990 に答える
1

XOR していると思われる数値を XOR しているのではありません。

あなたは11で100万110をXORしています

これら 2 つの数値の 2 進数表現のビットに対して XOR が実行されるため、2 進数11110100001010101110とを XOR し1011、結果は になり11110100001010100101ます。興味深いのは、その数値の 10 進数表現が であるということです。これは、2 進数と1000101を XOR した場合に得られる結果のバイナリ表現とまったく同じです。100011011

Decimal     Binary

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

10001102 進数とを XOR したい場合は、次の11ように記述します。

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

これにより、10進数が得られます69(2進数表現は です1000101)。

于 2016-09-30T19:10:12.727 に答える