0

我正在尝试在 JAVA 中实现有限域,为此我需要对两个二进制数进行异或。这是我的代码:

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

变量“溢出”的值为11。当我用溢出 (=11) 对 lastdigitsint 进行异或运算时,输出应该是 1000101。但是,代码输出的是 1095。

有人可以解释为什么会这样吗?谢谢你。

4

2 回答 2

1

您没有对您认为正在异或的数字进行异或运算。

你在异或 110 万 110 与 11

XOR 是对这两个数字的二进制表示的位执行的,因此您正在对二进制数11110100001010101110和进行 XOR 1011,这会导致11110100001010100101. 有趣的部分是该数字的十进制表示是1000101,这正是对二进制数1000110和进行异或运算得到的结果的二进制表示11

Decimal     Binary

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

如果你想对二进制数1000110和进行异或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;

这将为您提供十进制数69(其二进制表示为1000101)。

于 2016-09-30T19:10:12.727 回答
1

这从一开始就是错误的

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

最后一个数字值将是 1000110 -那是一千万百零十 ,所以二进制表示与您的预期大不相同。你想做的很简单:

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

接缝对我来说是合法的。

于 2016-09-30T18:57:20.990 回答